繁体   English   中英

正则表达式排除包含java中特定单词的句子

[英]regex to exclude a sentence which contains a specific word in java

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

    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”但是我的一个返回全部。 我也在堆栈上尝试了很多类似的帖子,但结果与我的相似,请提示一下。

解决方案:( (?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")

这在正则表达式检查器上运行良好,但是当我在java上尝试它时,它继续运行而不提供任何输出

如果你使一个正则表达式匹配"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).)+$

这将匹配整个(非空)行if-and-only-如果它在其中的任何地方都不包含"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("");

您可以使用此RegEx

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

DEMO

这基本上定义了2个捕获组

  1. 第一个捕获组(\\s*boolean visible = false)将捕获boolean visible = false

  2. 第二个捕获组(.*)将捕获除第一个捕获组捕获的所有内容之外的所有其他内容。

现在当你提取它时,只需捕获第二组并忽略第一组。


编辑

这是一个澄清的例子:

在这个例子中,

  • getOriginalFileContents()方法获取程序中显示的文件内容。
  • 注意我们如何获得两个组,但忽略第一组并仅打印第二组。

查看输出,该行没有该行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;
    }
}
type dw_\d\s+(.*?)\s+within(.*)\n(?!\s*boolean visible = false\s*)[\s\S]*?\s+end type

试试这个。看看演示。

https://regex101.com/r/Heex8W/1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM