【问题标题】:Java Regex match a special character excpet when it is within parenthesesJava 正则表达式匹配一个特殊字符,除非它在括号内
【发布时间】:2014-10-22 17:34:27
【问题描述】:

给定以下字符串:

foo().bar(norf.qux).fubar()

我想用点来分割它,除非它们在括号内,输出将是:

foo()
bar(norf.qux)
fubar()

这可能吗?

【问题讨论】:

  • "这可能吗?" yes,但是如果你可以无限嵌套这样的表达式,那么不要在这里使用正则表达式。编写自己的解析器。
  • 一个基本问题:你能嵌套括号吗?换句话说,像foo().bar(norf.qux()).fubar()foo().bar(norf.qux(buz.whatever())).fubar() 这样的可能吗?

标签: java regex match


【解决方案1】:

将输入的字符串用没有括在括号内的点分割。

\.(?![^()]*\))

在表示此正则表达式的 Java 字符串中,

"\\.(?![^()]*\\))"

DEMO

String[] tok = s.split("\\.(?![^()]*\\))");
System.out.println(Arrays.toString(tok));

输出:

[foo(), bar(norf.qux), fubar()]

模式说明:

\.                       '.'
(?!                      look ahead to see if there is not:
  [^()]*                   any character except: '(', ')' (0 or
                           more times)
  \)                       ')'
)                        end of look-ahead

【讨论】:

  • 谢谢这是我要找的第二个表达方式!
  • 你不需要在[^()]*中寻找)
【解决方案2】:

你可以像这样使用一个简单的正则表达式:

\B\.

Working demo

【讨论】:

  • 有趣,但我担心 OP 正在寻找正则表达式,它将根据 . 是否不在括号内进行拆分,而不是如果它不在 ) 之后。在这种情况下,我们可以简单地拆分(?<=[)])\.
  • @Pshemo 是的,我同意你的观点,但由于 OP 示例文本而刚刚发布了答案。这个简单的正则表达式适用于他的示例,它可能对他有用
  • 没关系,我不是 OP,所以我无法确定您的答案是否错误。我刚刚发布了我的评论,以添加有关您的答案假设的信息:)
  • 谢谢,也很有帮助。这适合我目前的情况,但我担心将来我会抓住这个foo().bar(norf.qux).fubar().bar(norf.qux),输出将是foo().bar(norf.qux) fubar() bar(norf.qux),不是预期的,但谢谢;)
  • 嗨@Lucas,感谢您的评论。只是为了让您知道,它也适用于您提到的示例regex101.com/r/kE6yQ8/2
猜你喜欢
  • 1970-01-01
  • 2016-04-18
  • 2021-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多