Java 远负向后看
如何更改字符串中的后视图 当单词“段落”位于模式(alpha)后面时,匹配为false,否则为true 例如,这将有5个匹配项: 代表法案(a)、(b)、(c)、(d)或 (e) (f)款 它们是:Java 远负向后看,java,regex,Java,Regex,如何更改字符串中的后视图 当单词“段落”位于模式(alpha)后面时,匹配为false,否则为true 例如,这将有5个匹配项: 代表法案(a)、(b)、(c)、(d)或 (e) (f)款 它们是:(a)(b)(c)(d)(e) 这将有0个匹配项: 代表(a)、(b)、(c)段所述的任何人行事, (d) 或(e) 这是不可能的任何长度与一个简单的向后看。Java regex flavor只允许有限长度查找(即,您可以通过以下方式执行(?): (我忽略了案例密集部分,您可以自己添加) 这是检查您的
(a)
(b)
(c)
(d)
(e)
这将有0个匹配项:
代表(a)、(b)、(c)段所述的任何人行事,
(d) 或(e)
这是不可能的任何长度与一个简单的向后看。Java regex flavor只允许有限长度查找(即,您可以通过以下方式执行
(?):
(我忽略了案例密集部分,您可以自己添加)
这是检查您的FALSE
案例是否匹配。即前面有段落的(a)
然后检查行是否与上面的正则表达式匹配,如果为true,则跳过,如果为false,则接受它
使用grep进行测试:(-v表示显示不匹配的行)
有一个小问题是,如果行中没有段落
,也没有(a)
,那么也会进行匹配。我认为在java程序中也很容易通过以下方式解决这一问题:
if (!m.find() && line.indexOf("(a)")>0) ...your match
您可以这样做:
// If "paragraph" (case insensitive) does not appear before any (<alpha>)
// It means that "paragraph" (case insensitive) will appear after one (<alpha>)
// OR it does not appear at all in the string.
if (!str.matches("(?s)(?:(?!\\([a-z]+\\)).)*(?i:paragraph).*")) {
// Use the Matcher loop to extract the text that matches pattern "\\([a-z]+\\)"
Pattern p = Pattern.compile("\\([a-z]+\\)");
Matcher m = p.matcher(str);
while (m.find()) {
System.out.println(m.group());
}
}
//如果“段落”(不区分大小写)未出现在任何()
//这意味着“段落”(不区分大小写)将出现在一()
//或者它根本不出现在字符串中。
如果(!str.matches(“(?s)(?:(?!\\([a-z]+\\))))*(?i:段落)。*”){
//使用Matcher循环提取与模式“\\([a-z]+\\)匹配的文本
Pattern p=Pattern.compile(“\\([a-z]+\\)”);
匹配器m=p.Matcher(str);
while(m.find()){
System.out.println(m.group());
}
}
在提取所有的()
之前,只需检查段落
没有出现在所有()
之前。这将适用于任何长度的字符串。我不理解你问题的第二段。:@ThreaT是的,更好的是,你可以用相反的方式思考你的问题。尝试匹配那些“false”案例。这可能会让事情变得更简单。详细信息请查看我的答案。你能在www.gskinner.com/RegExr
中试试吗?出于某种原因测试测试(a)
和段落测试(a)
don't work for meRegExr使用ActionScript 3的regex风格:是的。您可以发布一个链接到它来演示您的模式吗。是的,问题之前已经说过了。但是(a)段(b)
不会(甚至在(a)
上也不会),这是限制之一…因此我不会盲目推荐这种方法。Kent你能尝试在www.gskinner.com/RegExr
上运行这种模式并共享到it@ThreaT我一直在避免那样做
".*Paragraph.*\\(a\\)"
kent$ cat test.txt
(a)
Paragraph (a)
(b) (c)
foo bar Paragraph (a) (b)
foo bar Paragraph (some) (a) (b)
foo bar (a) (b) Paragraph (c)
kent$ grep -v '.*Paragraph.*\(a\)' test.txt
(a)
(b) (c)
foo bar (a) (b) Paragraph (c)
if (!m.find() && line.indexOf("(a)")>0) ...your match
// If "paragraph" (case insensitive) does not appear before any (<alpha>)
// It means that "paragraph" (case insensitive) will appear after one (<alpha>)
// OR it does not appear at all in the string.
if (!str.matches("(?s)(?:(?!\\([a-z]+\\)).)*(?i:paragraph).*")) {
// Use the Matcher loop to extract the text that matches pattern "\\([a-z]+\\)"
Pattern p = Pattern.compile("\\([a-z]+\\)");
Matcher m = p.matcher(str);
while (m.find()) {
System.out.println(m.group());
}
}