当前位置: 首页 > 面试题库 >

如何用条件分割字符串

柯阳曦
2023-03-14
问题内容

分割字符串时,如何确定 分隔符是否位于两个字符之间,将不会考虑该分隔符

// Input
String string = "a,b,[c,d],e";
String[] split = string.split(",");
// Output
split[0] // "a"
split[1] // "b"
split[2] // "[c"
split[3] // "d]"
split[4] // "e"
// Required
split[0] // "a"
split[1] // "b"
split[2] // "[c,d]"
split[3] // "e"

问题答案:

答案结尾处的首选方法

看来您正在寻找环顾四周的机制。

例如,如果您想在没有foo之前和bar之后没有空格的空白处进行拆分,则您的代码可以像

split("(?<!foo)\\s(?!bar)")

更新 (假设没有任何嵌套,[...]并且它们的格式正确,例如全部[用封闭]):

您的情况似乎更复杂。你能做的就是接受,如果

  • 它没有任何东西[]之后,
  • 或者如果[该逗号后的第一个左括号,则]该逗号与其本身之间没有右括号,否则就意味着该逗号位于区域之内,例如
    [ , ] [
    

    ^ ^ ^ - first [ after tested comma
    | +---- one ] between tested comma and first [ after it
    +------ tested comma

因此您的代码可能看起来像
(这是原始版本,但下面是一些简化的版本)

split(",(?=[^\\]]*(\\[|$))")

这个正则表达式是基于这样的想法:您不想接受的逗号在内部[foo,bar]。但是,如何确定我们在此类块的内部(或外部)呢?

  1. 如果性格里面那么就不会有[之后的字符,直到我们找到](旁边[发现后会出现]的情况下,像[a,b],[c,d]之间的逗号ab没有[,直到它找到],但可以有一些新的领域[..]后,这ofcourse打头[
  2. 如果字符在[...]区域之外,则下一个字符之后只能显示非]字符,直到找到[...]区域的开始,否则我们将读取字符串的结尾。

第二种情况是您感兴趣的情况。因此,我们需要创建一个regex,它接受,]在其之后为non的regex (它不在inside
[...]),直到找到[或读取字符串的结尾(由表示$

这样的正则表达式可以写成

  • , 逗号
  • (?=...) 在它之后
  • [^\\]]*(\\[|$)
    • [^\\]]*零个或多个非]字符(]需要以元字符转义)
    • (\\[|$)后面有[(也需要在正则表达式中转义)或字符串结尾的字符串

小简化分割版

string.split(",(?![^\\[]*\\])");

意思是:分割逗号,,逗号之后没有((?!...)未用表示)未关闭](被测试的逗号与本身之间]没有unclose的形式[,可以写成[^\\[]*\\]

首选方法

为了避免这种复杂的正则表达式,请不要使用splitPattern和Matcher类,它们将搜索类似[...]或非逗号的区域。

String string = "a,b,[c,d],e";
Pattern p = Pattern.compile("\\[.*?\\]|[^,]+");
Matcher m = p.matcher(string);
while (m.find())
    System.out.println(m.group());

输出:

a
b
[c,d]
e


 类似资料:
  • 问题内容: 我想知道是否可以仅在angularJS中拆分字符串。我有我的 在我的控制器和我看来,我想做这样的事情 我已经看到了很多关于输入和ng-change调用控制器中的函数的信息,这些函数使用ng-list拆分字符串或其他内容,但在我的情况下没有任何效果。 谢谢大家。 问题答案: 您可能希望将该功能包装到过滤器中,这样就不必在所有控制器中都放置mySplit函数。例如 在这里,您可以按原先的意

  • 问题内容: 我知道您可以使用分割字符串。但是我不知道如何用两个定界符分割字符串。 例: 我需要这样的东西: 它的正则表达式是什么? 问题答案: 用这个 :

  • 问题内容: 我有一个字符串如下: 我想提取数字:872226816,因此在这种情况下,我假设在第二个逗号开始读取数据之后,随后的逗号结束数据读取。 输出示例: 问题答案: 用于String.split()的 Javadoc

  • 问题内容: let string = “hello hi” var hello = “” var hi = “” 我不会分割字符串,以便hello的值获得“ hello”,hi的值获得“ hi” 问题答案: 试试这个: 字符串的名称在哪里,并且包含由空格分隔的组件。 然后,您可以将组件获取为: Doc:componentsSeparatedByString 编辑: 对于Swift 3,以上将是:

  • 问题内容: 我想用和分开 因此处理后应该得到: 问题答案: 对更新问题的更新答案:

  • 问题内容: 我是android开发的菜鸟,我正尝试通过多个换行符将字符串拆分多次。我要拆分的字符串是从数据库查询中提取的,其结构如下: result.getCoin的内容如下: 我想在换行处拆分字符串,然后将每个子字符串放入字符串数组。这是我当前的代码: 这给了我一个输出: 而不是我想要的输出: 任何帮助是极大的赞赏 问题答案: 您可以使用以下语句按换行符分割字符串: