2016-07-04 77 views
2

我试图创建一个正则表达式模式来匹配一个特定的字符串,并返回true如果字符串匹配的模式和false如果不是。这里的条件是:Java正则表达式

  1. 必须与[开始和]
  2. 结束的每个项目内的支架必须用逗号隔开
  3. 用逗号隔开的每个项目都遵循这个正则表达式: ^[A-Za-z][A-Za-z0-9_]*$

如何让一个正则表达式检查所有这些条件?

+0

任何地方都不允许有空格? – markspace

回答

2

在Java中,\w没有Pattern.UNICODE_CHARACTER_CLASS标志实际上与[a-zA-Z0-9_]相同。所以,我会用

String pat = "\\[[a-zA-Z]\\w*(?:,[a-zA-Z]\\w*)*]"; 

查看IDEONE demo。与String#matches一起使用,或者您必须在开头添加^(或\\A),并在末尾添加$(或\\z)。

String pat = "\\[[a-zA-Z]\\w*(?:,[a-zA-Z]\\w*)*]"; 
System.out.println("[c1,T4,yu5]".matches(pat)); // TRUE 

模式解释

  • \\[ - 字面[
  • [a-zA-Z] - 英文字母(同\\p{Alpha}
  • \\w* - 从[a-zA-Z0-9_]零个或多个字符集
  • (?: - 非捕获组匹配的开始...
    • , - 逗号
    • [a-zA-Z]\\w* - 见上文
  • )* - ...零次或多次
  • ] - 一个字面意思](不需要在字面类以外的字面上转义)。
+0

所以这与Zbynek的本质是相同的正则表达式,除了你用'\\ w'替换了'[a-zA-Z0-9_]'? –

+1

如果是这样,那么两者都适合我。谢谢你的答案。 –

3

封闭组中可能重复:

\[[A-Za-z][A-Za-z0-9_]*(?:,[A-Za-z][A-Za-z0-9_])*\] 

这是应该出现在最终的字符串。根据特定语言逃脱特价商品。

+5

正则表达式使下半部分重复(减少回溯)更好,并且不需要捕获任何东西,所以:'[[A-Za-z] [A-Za-z0-9 _] *(? :,[A-Za-z] [A-Za-z0-9 _] *)* \]' – Andreas

+0

是的。谢谢! –