2016-01-20 42 views
2

我想写一个Java正则表达式来匹配逗号分隔的接口列表。例如: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()) 
    ... 

但是,有没有办法,包括“零项目”的条件为正则表达式?

+0

你能解释“空壳”是什么意思吗? – Pshemo

回答

2

为了使图案可选的,使用一组具有?量词设置为它:

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

?贪婪量词匹配它被施加到该图案的一周或零的发生。 (贪婪意味着它更喜欢得到1次出现而不是0) (?:字符序列打开一个非捕获组。 I.E.这是您如何使用“正常括号”对逻辑分组正规表达式的部分进行分组。

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

+0

只是FYI:我建议使用[regex101.com](http://regex101.com)来检查你的模式。 –

1

尝试String regex = "^$|" + regex^$表示“输入开始和输入结束之间没有任何内容”。^$ |意思是“不匹配任何东西或匹配任何与正则表达式的其余部分相匹配的东西”

+0

我认为[regex101.com](http://regex101.com)也可以向OP解释。 :) –

+0

@WiktorStribiżew真实,它是很好的有这个工具,但人类书面答案通常比机器生成的答案更可读(详细,但细节水平有限 - 他们也不总是可以解释*想法*哪个正则表达式作者试图*实现*)。 – Pshemo

+0

@geneSummons你可以在'^'和'$'之间包含一些空格,以便让正则表达式匹配也只有空白输入哪个OP似乎是用's.trim()'处理的。所以它看起来像'“^ \ s * $ | ...”'在这里可能会更好。 – Pshemo

相关问题