我正在尝试编写一个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 :(得分:2)
要使模式可选,请使用设置了?
量词的组:
String regex = "(?:" + validName + "\\s*(?:,\\s*" + validName + ")*)?";
// ^^^ ^^
if (s.matches(regex) {
// ....
}
?
贪心量词匹配它应用的模式的一次或零次出现。 (贪婪意味着它更喜欢获得1次而不是0次)
(?:
字符序列打开一个非捕获组。 I.E.这就是你如何使用"正常的括号"用于逻辑分组正则表达式的部分。
您可以在模式的开头/结尾添加\\s*
个子模式,以允许前导/尾随空格。
答案 1 :(得分:1)
尝试String regex = "^$|" + regex
^ $表示“在输入的开头和输入的结尾之间没有任何内容”。 ^ $ |意思是“要么匹配任何东西,要么匹配与正则表达式的其余部分相匹配的任何东西”