【问题标题】:Regex split by delimeter excluding escaped ones and keep empty strings正则表达式按分隔符拆分,不包括转义的,并保留空字符串
【发布时间】:2023-04-06 12:00:01
【问题描述】:

我需要用“|”分割一个字符串作为分隔符,可以使用前面的“?”进行转义,在这种情况下,不应将其视为分隔符。 我还想在结果中保留空字符串,其中有多个分隔符彼此跟随,中间没有任何东西 - 我实际上对这部分有问题。

几个例子:

aaa|bbb|ccc
Result:
aaa
bbb
ccc

aaa?|bbb|ccc
Result:
aaa?|bbb
ccc

aaa?|bbb||ccc|||ddd
Result:
aaa?bbb
<empty string>
ccc
<empty string>
<empty string>
ddd

我正在使用下面的正则表达式,它在转义分隔符的同时正确拆分字符串,但在“||”的情况下它会丢弃所有空字符串。我正在使用 Pattern/Matcher 和 Java。

([^?\\|]|\\?.)+

任何帮助表示赞赏。

【问题讨论】:

  • 可以使用前面的“?”进行转义??.. 你确定吗 '?'用于转义?
  • ?在正则表达式中具有特殊含义,您的输出也证明了这一点。它没有逃脱
  • 我的意思是如果“?”在分隔符之前,然后它不会像实际的分隔符一样对待。 IE。 “?|”不应将其视为分隔符,而“|”应该。 S抱歉,可能解释错了。
  • 这里没有模式。不要使用正则表达式

标签: java regex


【解决方案1】:

您可以尝试将此PatternString.split 方法一起使用:

String[] input = {"aaa|bbb|ccc", "aaa?|bbb|ccc", "aaa?|bbb||ccc|||ddd"};
for (String s: input) {
    //                                          | negative lookbehind for "?" (escaped)
    //                                          |       | "|" (escaped)
    //                                          |       | 
    System.out.println(Arrays.toString(s.split("(?<!\\?)\\|")));
}

输出

[aaa, bbb, ccc]
[aaa?|bbb, ccc]
[aaa?|bbb, , ccc, , , ddd]

【讨论】:

  • 虽然这个答案是正确的,但我认为在这种情况下使用正则表达式并不明智。当您查看输入时,本身并没有模式。
  • @TheLostMind 我同意从长远来看这可能需要自定义解析器,但因此我认为 is 在特定/文字范围内的模式问题。
猜你喜欢
  • 2012-08-13
  • 2014-11-22
  • 2011-02-24
  • 2013-07-06
  • 2013-09-27
  • 2021-04-23
  • 1970-01-01
相关资源
最近更新 更多