0

对不起,伙计们,我用谷歌搜索了,仍然无法让我的代码工作。不完全是java的高手(还没有,但给我时间:-))。我有一个 xml 文档,我正在使用 DOM 解析器来读取、提取类属性,现在我需要使用正则表达式排除其中一些属性。例如,到目前为止我的输出是:

[[#text: ns1:Spare3]]

[[#text: ns1:Spare4]]

[[#text: ns1:Spare5]]

[[#text: ns1:Street]]

[[#text: ns1:Anything]]

[[#text: ns1:TearLineDateUpdated]]

[[#text: ns1:SourceReportTearline]]

[[#text: ns1:AnyFilter]]

[[#text: ns1:UpdatedByTelecom]]

[[#text: ns1:UpdatedByName]]

我需要排除那些包含单词的行Spare,或者以TearLine(不区分大小写)和其他一些开头。

我的代码片段(我写来测试)说:

Pattern p = Pattern.compile(".*?\\Spare\\(.*?\\)",    
Pattern.CASE_INSENSITIVE|Pattern.DOTALL | Pattern.MULTILINE);
Matcher m = p.matcher((nl.item(i)).toString());
if (m.matches())
{
System.out.println("["+nl.item(i)+"]" + "matched"); 
}
else
{
System.out.println("["+nl.item(i)+"]" + "not matched");     
}

我如何排除任何包含单词的Spare行和任何以开头的行TearLine(但TearLine可以出现在单词的其他地方,这没关系)。?

4

5 回答 5

1

这些是您要匹配的实际字符串吗?也就是说,DOM 解析器生成了这些字符串,而现在您正在对它们应用正则表达式?如果是这样,你想要这样的东西:

Pattern p = Pattern.compile(
    "ns1:(tearline|.*spare)", Pattern.CASE_INSENSITIVE
);
Matcher m = p.matcher("");

String[] inputs = {
    "[[#text: ns1:Spare3]]",
    "[[#text: ns1:Spare4]]",
    "[[#text: ns1:Spare5]]",
    "[[#text: ns1:Street]]",
    "[[#text: ns1:Anything]]",
    "[[#text: ns1:TearLineDateUpdated]]",
    "[[#text: ns1:SourceReportTearline]]",
    "[[#text: ns1:AnyFilter]]",
    "[[#text: ns1:UpdatedByTelecom]]",
    "[[#text: ns1:UpdatedByName]]"
};

for (String s : inputs)
{
  System.out.printf( "%n%5b => %s%n", !m.reset(s).find(), s );
}

输出:

false => [[#text: ns1:Spare3]]

false => [[#text: ns1:Spare4]]

false => [[#text: ns1:Spare5]]

 true => [[#text: ns1:Street]]

 true => [[#text: ns1:Anything]]

false => [[#text: ns1:TearLineDateUpdated]]

 true => [[#text: ns1:SourceReportTearline]]

 true => [[#text: ns1:AnyFilter]]

 true => [[#text: ns1:UpdatedByTelecom]]

 true => [[#text: ns1:UpdatedByName]]

笔记:

  • 我使用find()了而不是matches()所以我的正则表达式只需要匹配我感兴趣的部分,而不是整个字符串。

  • 其他一些响应者之所以使用^TearLine,是因为您说该词必须出现在行首,但如果我的猜测是正确的,您真的想在ns1:前缀之后匹配它。另一方面,.*spare允许spare出现在任何地方,而不仅仅是在开头(.*?spare也可以)。

  • 类似地,Ωmega"\\bSpare\\b"假设您只对完整的单词感兴趣Spare。我省略了边界(\b)这个词,因为您似乎想要匹配诸如Spare3或(我猜)之类的东西FooSpare

  • 我不知道您为什么要添加\\(.*?\\)到您的正则表达式中,因为您的示例字符串中没有括号。

于 2012-10-20T14:17:12.507 回答
1

没关系使用所有这些代码行 - 只需使用这个简单的一行代码String.matches()

if (nl.item(i).toString().matches("(?i)(?s).*ns1:(spare|tearline).*")) {
    // not matched
else {
    // matched
}

fyi(?i)使正则表达式不区分大小写,并且(?s)Pattern.DOTALL.

于 2012-10-20T10:32:58.743 回答
0

使用正则表达式模式

^(?:TearLine.*|.*\\bSpare\\b)
于 2012-10-19T23:20:10.167 回答
-1

您可能想摆脱第一个反斜杠

".*?Spare\\(.*?\\)"

因为\S匹配任何不是空白的东西。

另一方面,您的正则表达式需要如下所示:

"ns1:tearline.*"
于 2012-10-19T23:15:18.117 回答
-1

要匹配以 TearLine 开头的行:

^TearLine

要匹配包含 Spare 的行:

Spare

将它们组合在一个表达式中:

(?:^TearLine)|(?:Spare)
于 2012-10-19T23:17:58.137 回答