Java 该正则表达式是否始终按照以下要求工作?
这个正则表达式将一个句子分成3个标记是否正确:Java 该正则表达式是否始终按照以下要求工作?,java,regex,Java,Regex,这个正则表达式将一个句子分成3个标记是否正确: 括号内小写字母前的字符 括号内的小写字母,包括括号 小写括号后的字符 System.out.println(“这是(a)测试“.matches(^(.*)\([a-z]*\\)(.*)”) 字符串可能有也可能没有括号小写字母,它可能出现在句子的任何地方。如果您在我没有考虑过的用例中看到一个缺陷,您能在regex中提供更正吗 对于上述示例 Group1 captures This is Group2 captures (a) Group3 capt
System.out.println(“这是(a)测试“.matches(^(.*)\([a-z]*\\)(.*)”)代码>
字符串可能有也可能没有括号小写字母,它可能出现在句子的任何地方。如果您在我没有考虑过的用例中看到一个缺陷,您能在regex中提供更正吗
对于上述示例
Group1 captures This is
Group2 captures (a)
Group3 captures test
编辑::如何更改正则表达式以实现以下目的
如果字符串有(foo)(bar)(baz),如何捕获group1=empty group2=(foo)和group3=empty。并三次找到上面的模式,因为有3个括号。与检查正则表达式不同,每当我编写正则表达式时,我都会编写一系列单元测试来覆盖每种情况。我建议你也这样做。使用正则表达式创建四个测试(至少),并对字符串进行测试:
- (a) 这是测试
- 这是一个测试
- 这是测试(a)
- 这是一个测试
这应该涵盖你描述的每一个案例。这比手动分析每种情况下的正则表达式要容易得多,也要快得多。如果您想确保在您的下一代中包含字符,您应该使用+
,它可以支持一次或多次
[a-z]+
按照它的方式,这是(a)(b)测试将产生
Group1 captures This is
Group2 captures (a)
Group3 captures (b) test
如果Group2应该是(b)
,那么应该在Group1中使用贪婪的regexp
建议的测试用例:
- 空-真的空,不能有一个空的子弹头李>
- 富(酒吧)巴兹
- (foo)(bar)(baz)
- (富)巴(巴)
- 傅(酒吧)(巴兹)兵
- 富(酒吧)巴(宾)
- 富(酒吧)
- (富)酒吧
您的正则表达式有一个小问题
你在定义中说你有3个组,而实际上你的模式包含2个
使用文字括号不能算作一个组,因此您需要使用如下内容:
"^(.*)?(\\([a-z]*\\))(.*)?$"
或者,如果您不需要括号,只需要字母,您可以更改顺序:
"^(.*)?\\(([a-z]*)\\)(.*)?$"
除此之外,这似乎还可以,但请记住,括号之间的小写字母在您的模式中不是强制性的。如果您希望第一组和第三组包含偏执词前后的所有字符,您必须确保它们排除了(
和)
(您的*
还将匹配包含偏执主题的组,例如第二个示例中的(foo)(bar)
)
所以我将用这个[^\\\(\\)]*
替换*
此外,如果要匹配包含第二个组的许多子字符串的字符串(如第二个示例中所示),则应在第二个组之后添加*
我的结果是:
^([^\\(\\)]*)?(\\([a-z]*\\))*([^\\(\\)]*)?$
这将适用于第一个示例和第二个示例,但第二个组最终将只存储找到的最后一个-(bz)
如果您想像在第二个示例中所说的那样捕获第二个组3次,您可以尝试使用while m.find()
,而不是If m.matches()
(m
是匹配器
对象);还可以稍微更改您的正则表达式:
([^\\(\\)]*)(\\([a-z]*\\))([^\\(\\)]*)
这将是字符串中每个可能匹配项的第二组-(foo)
,(bar)
,(bz)
编辑:
由于某种原因,我无法真正解释,对我来说,它没有找到(foo)
,只有另外两个。因此我编写了一段代码,尝试使用参数应用find()
,明确地从某个位置开始,最后找到的组在该位置结束:
String regex = "([^\\(\\)]*)(\\([a-z]*\\))([^\\(\\)]*)";
String text = "(foo)(bar)(bz)";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(text);
for (int reg = 0; reg < text.length(); reg+=(m.end()-m.start()))
if (m.find(reg))
for (int group = 1; group <=m.groupCount(); group++)
System.out.println("Group "+group+": "+m.group(group));
在python中:
r=re.compile(r'([^()]*)(\([a-z)(]*\)([^()]*))
字符串是否包含新行字符?并且正则表达式将匹配()
-这样可以吗?你放弃这个问题了吗?解决方案到底是什么?测试用例很好,但为了完全确定它的正确性,你需要分析正则表达式。忽略边界测试用例和测试用例来检查正则表达式是否过匹配是很常见的。是的,我添加了括号,以便始终在组2中为例如(foo)(bar)(baz)如何捕获group1=empty group2=(foo)和group3=empty,它将三次找到上面的模式,因为有3个括号
Group 1:
Group 2: (foo)
Group 3:
Group 1:
Group 2: (bar)
Group 3:
Group 1:
Group 2: (bz)
Group 3:
r.match('abc(xx)dd').groups()
('abc', '(xx)', 'dd')`
r.match('abc(xx)(dd)dd').groups()
('abc', '(xx)(dd)', 'dd')
r.match('(abc)').groups()
('', '(abc)', '')