【问题标题】:Java Regex to match comma delimited list of interfacesJava Regex 以匹配以逗号分隔的接口列表
【发布时间】:2016-01-22 03:38:10
【问题描述】:

我正在尝试编写一个 Java 正则表达式来匹配以逗号分隔的接口列表。比如:

Runnable, Serializable, List, Map

列表中可以有零个或多个条目。尾随逗号无效。空格是可选的。我想出了以下内容,这让我进入一个或多个条目,然后检查是否为空:

String validName = "[a-zA-Z_][a-zA-Z0-9_]*";
String regex = validName + "\\s*(,\\s*" + validName + ")*";
if (s.matches(regex) || s.trim().isEmpty())
  ...

但是有没有办法在正则表达式中包含“零条目”条件?

【问题讨论】:

  • 你能解释一下“空箱”是什么意思吗?

标签: java regex


【解决方案1】:

要使模式可选,请使用设置了? 量词的组:

String regex = "(?:" + validName + "\\s*(?:,\\s*" + validName + ")*)?";
//              ^^^                                                ^^
if (s.matches(regex) { 
 // ....
}

? 贪心量词匹配它所应用的模式的一次或零次出现。 (贪婪意味着它更喜欢出现 1 次而不是 0 次) (?: 字符序列打开一个非捕获组。 IE。这就是您如何使用“普通括号”对正则表达式的各个部分进行逻辑分组。

您可以在模式的开头/结尾添加\\s* 子模式以允许前导/尾随空格。

【讨论】:

  • 仅供参考:我建议使用regex101.com 来检查您的模式。
【解决方案2】:

试试String regex = "^$|" + regex ^$ 的意思是“输入的开头和输入的结尾之间没有任何东西”。 ^$|意思是“要么不匹配,要么匹配任何匹配正则表达式的其余部分”

【讨论】:

  • @WiktorStribiżew 是的,很高兴拥有这个工具,但人工编写的答案通常比机器生成的答案更具可读性(这些答案很详细,但详细程度有限 - 他们也并不总是可以解释idea 正则表达式作者试图实现)。
  • @geneSummons 您可以在^$ 之间包含一些空格,以让正则表达式也只匹配OP 似乎正在使用s.trim() 处理的空格输入。所以看起来"^\\s*$|..." 在这里可能会更好。
  • 使用替代方法是一种有效但效率较低的方法。
猜你喜欢
  • 2012-05-09
  • 2015-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多