Java 远负向后看

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只允许有限长度查找(即,您可以通过以下方式执行(?): (我忽略了案例密集部分,您可以自己添加) 这是检查您的

如何更改字符串中的后视图

当单词“段落”位于模式(alpha)后面时,匹配为false,否则为true

例如,这将有5个匹配项

代表法案(a)、(b)、(c)、(d)或 (e) (f)款

它们是:
(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());
    }
}