regex排除包含java中特定单词的句子

6psbrbz9  于 2021-07-09  发布在  Java
关注(0)|答案(3)|浏览(461)

我正在阅读一个包含大量信息的文件,如下所示:

type dw_3 from u_dw within w_pg6p0012_01
    boolean visible = false
    integer x = 1797
    integer y = 388
    integer width = 887
    integer height = 112
    integer taborder = 0
    boolean bringtotop = true
    string dataobject = "d_pg6p0012_14"
    end type

    type dw_3 from u_dw within w_pg6p0012_01
    integer x = 1797
    integer y = 388
    integer width = 887
    integer height = 112
    integer taborder = 0
    boolean bringtotop = true
    string dataobject = "d_pg6p0012_14"
    end type

我做了正则表达式: (?i)type dw_\d\s+(.*?)\s+within(.*?)\s+(?!boolean visible = false)(.*) 我想提取所有不包含“boolean visible=false”的字符串,但我的字符串返回all。我也尝试了许多类似的职位上的堆栈,但结果是类似的我,请建议一种方法。
解决方案: (?i)type\\s+dw_(\\d+|\\w+)\\s+from\\s+.*?within\\s+.*?\\s+(string|integer)?\\s+.*\\s+.*\\s+.*\\s+.*?\\s+.*?\\s+.*?\\s*string\\s+dataobject\\s+=\\s+(.*?)\\s+end\\s+type") 这在regex-checker上运行得很好,但是当我在java上尝试它时,它一直在运行,没有给出任何输出

kr98yfug

kr98yfug1#

你可以用这个正则表达式

(\s*boolean visible = false)|(.*)

演示
这基本上定义了两个捕获组
第一捕获组 (\s*boolean visible = false) 会抓住的 boolean visible = false .
第二捕获组 (.*) 将捕获除第一捕获组捕获之外的所有其他内容。
现在,当你提取它时,只需捕获第二组,忽略第一组。
编辑
下面是一个澄清的例子:
在这个例子中,
方法获取文件的内容,如程序所示。
注意我们如何得到两个组,但是忽略第一个组,只打印第二个组。
看输出,没有那行 boolean visible = false .
输出

type dw_3 from u_dw within w_pg6p0012_01
 integer x = 1797
 integer y = 388
 integer width = 887
 integer height = 112
 integer taborder = 0
 boolean bringtotop = true
 string dataobject = "d_pg6p0012_14"
 end type

 type dw_3 from u_dw within w_pg6p0012_01
 integer x = 1797
 integer y = 388
 integer width = 887
 integer height = 112
 integer taborder = 0
 boolean bringtotop = true
 string dataobject = "d_pg6p0012_14"
 end type

java实现

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexTut3 {

    public static void main(String args[]) {
        String file = getOriginalFileContents();
        Pattern pattern = Pattern.compile("(\\s*boolean visible = false)|(.*)");
        Matcher matcher = pattern.matcher(file);
        while (matcher.find()) {
            //System.out.print(matcher.group(1)); //ignore this group
            if (matcher.group(2) != null) System.out.println(matcher.group(2));
        }
    }

    //this method just get's the file contents as displayed in the
    //question. 
    private static String getOriginalFileContents() {
        String s = "     type dw_3 from u_dw within w_pg6p0012_01\n" +
            "     boolean visible = false\n" +
            "     integer x = 1797\n" +
            "     integer y = 388\n" +
            "     integer width = 887\n" +
            "     integer height = 112\n" +
            "     integer taborder = 0\n" +
            "     boolean bringtotop = true\n" +
            "     string dataobject = \"d_pg6p0012_14\"\n" +
            "     end type\n" +
            "     \n" +
            "     type dw_3 from u_dw within w_pg6p0012_01\n" +
            "     integer x = 1797\n" +
            "     integer y = 388\n" +
            "     integer width = 887\n" +
            "     integer height = 112\n" +
            "     integer taborder = 0\n" +
            "     boolean bringtotop = true\n" +
            "     string dataobject = \"d_pg6p0012_14\"\n" +
            "     end type";

        return s;
    }
}
j9per5c4

j9per5c42#

type dw_\d\s+(.*?)\s+within(.*)\n(?!\s*boolean visible = false\s*)[\s\S]*?\s+end type

试试这个。看演示。
https://regex101.com/r/heex8w/1

lqfhib0f

lqfhib0f3#

如果你做一个正则表达式来匹配,它会更容易(也更易读) "boolean visible = false" 然后排除包含匹配项的行。

Pattern pattern = Pattern.compile("boolean visible = false");

Files.lines(filepath)
     .filter(line -> !pattern.matcher(line).find())  // note the "!"
     .forEach(/* do stuff */);

笔记:
因为我们正在使用 Files#lines(String) ,则不必在正则表达式中分隔单独的行。这已经为我们做了。
这个 Matcher#find() 方法返回给定的字符序列中是否包含与正则表达式匹配的任何位置。我相信这就是你想要的。
编辑:
现在,如果你真的想使用纯正则表达式,那么试试这个:

^((?!boolean visible = false).)+$

当且仅当它不包含 "boolean visible = false" 在它的任何地方。提取所需文本不需要复杂的反向引用/捕获组语义。
请参见此处的单元测试证明:https://regex101.com/r/dbzdmb/1
编辑#2:
或者,如果您所要做的只是获取文件文本而没有任何 "boolean visible = false" ,则可以简单地用空字符串替换该目标字符串的每个示例。

Pattern pattern = Pattern.compile("boolean visible = false");
Matcher matcher = pattern.matcher(fileAsCharSequence);  // e.g. StringBuilder
String output = matcher.replaceAll("");

相关问题