【问题标题】:Regular Expression, how to split with | and avoiding to split when \ is before正则表达式,如何拆分 |并避免在 \ 之前进行拆分
【发布时间】:2012-03-14 06:22:37
【问题描述】:

我有下一段文字

 aaa|bbbb|cccc|dddd\|eeee|ffff

我想用 | 分割不包括何时 |前面是\并获取

啊啊

bbbb

cccc

dddd\|eeee

ffff

谢谢。

ps:我尝试使用一些正则表达式生成器(例如 http://txt2re.com/),但坦率地说,正则表达式一点也不友好。

更新:最后我放弃了。正则表达式不快(我做了一个基准测试),也不清晰(与每个人都可以遵循的函数相比),然后我跳过它,现在我使用的是真实代码。

【问题讨论】:

  • 听起来你想要一个否定的lookbehind断言。
  • 为什么是dddd\|eeee 而不是dddd|eeee
  • 如果你的模式这么简单,你也可以只遍历字符,只有找到管道|时才拆分,但前面的字符不是反斜杠`\`。我不确定您的输入字符串是如何构造的,但是如果您可以控制它,您也可以不使用 \|在那个位置,但如果可以的话,使用不同的字符。
  • @Gabe 我不知道我怎么会因为一个问题而被降级,但发生了(巨魔?愤怒的开发者?)。我个人不同意任何反对意见。 @Tim Cooper 我尽量保留反斜杠,我不想删除它。 @ normalocity 因为反斜杠是事实上的标准,所以我想保留它并使用它。

标签: java regex


【解决方案1】:

试图将此作为评论添加到 eyelidlessness 的答案中,但不知道如何格式化它...

无论如何,我觉得无眼皮的答案是正确的:

    String str = "aaa|bbbb|cccc|dddd\\|eeee|ffff";
    String[] tokens = str.split("(?<!\\\\)\\|");
    System.out.println(Arrays.toString(tokens));    

哪个打印:

[aaa, bbbb, cccc, dddd\|eeee, ffff]

【讨论】:

  • 是的,这是真的,这不会处理转义的反斜杠,但我想这取决于这是否是一个问题。也许他们不会存在于这张海报工作的任何领域。
【解决方案2】:

应该这样做:

(?<!\\\\)\\|

如果你想允许反斜杠转义的反斜杠,你可以使用:

(?<!(?<!\\\\)\\\\)\\|

所以给定字符串aaa|bbbb|cccc|dddd\|eeee\\|ffff,拆分为:


    aaa
    bbbb
    cccc
    dddd|eeee\*
    ffff

* 或dddd\|eeee\\,如果您出于某种原因没有去除转义反斜杠。

编辑:不熟悉 Java 正则表达式风格,为每个棘轮怪胎的评论添加了转义。

【讨论】:

  • 你可能想用java语法"(?&lt;!\\\\)\\|"
  • 谢谢,但它不起作用:value1:aaa|bbbb|cccc|dddd value2:|eeee|ffff,我想我会走风景路线,替换“\|”为了一个安全的字符,然后用“|”分割并替换回“\|”
【解决方案3】:

不要为此使用split()。 (如果 Java 在后向断言中支持无限重复,则可以。但它不支持。)

最好收集|s之间的所有匹配项:

List<String> matchList = new ArrayList<String>();
Pattern regex = Pattern.compile("(?:\\\\.|[^\\\\|])*");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
    matchList.add(regexMatcher.group());
}

这会将aaa|bbbb\\|cccc|dddd\|eeee|ffff\\\|ggg\\\\|hhhh 正确拆分为

aaa
bbbb\\
cccc
dddd\|eeee
ffff\\\|ggg\\\\
hhhh

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 1970-01-01
    • 2017-07-07
    • 2021-11-08
    • 2010-11-03
    • 2021-12-27
    相关资源
    最近更新 更多