【问题标题】:How to match any word but ignore those that starts with multiple whitespaces?如何匹配任何单词但忽略以多个空格开头的单词?
【发布时间】:2015-11-25 12:46:50
【问题描述】:

我想要实现的是匹配文本中的所有单词,但忽略那些以 4 个空格开头的行中(新行之前)的单词。


示例

查找单词的文本文件:

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do 
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut 
enim ad minim veniam, quis nostrud exercitation ullamco laboris 
nisi ut aliquip ex ea commodo consequat.

    This must NOT be matched. Because it has 4 whitespaces at the beginning.

Lorem ipsum dolor sit amet. Ut enim ad minim veniam.


因此,下一行中的单词不应该被认为与模式匹配:

This must NOT be matched. Because it has 4 whitespaces at the beginning.


代码

这是我的正则表达式,它可以找到所有单词:

\\b[A-Za-z]+\\b

我知道在 Java 的 RegEx 语法中有 except^ 符号,但我只知道如何在更简单的表达式中使用它。

【问题讨论】:

  • 如何处理单行?如果在任何时候该行位于 String 中,则跳过检查字符串是否以 fout 空格开头。
  • @SubOptimal 我从文件中读取文本并将其分配给一个字符串变量,所以我的所有文本都存储在一个字符串变量中
  • 您要匹配所有还是所有不以4个空格开头的单词
  • @RDay 我想匹配行中的所有单词
  • @RDay '^(?!\s)[\w\s!-~]+' 这也应该选择所有标点符号

标签: java regex


【解决方案1】:

也许遵循 sn-p 可能是您想要实现的目标的基础。

String[] lines = {"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do",
    "eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut",
    "enim ad minim veniam, quis nostrud exercitation ullamco laboris",
    "nisi ut aliquip ex ea commodo consequat.",
    "",
    "    This must NOT be matched. Because it has 4 whitespaces at the beginning.",
    "",
    "Lorem ipsum dolor sit amet. Ut enim ad minim veniam."};
for (String line : lines) {
    if (!line.startsWith("    ")) {
        String[] words = line.split("[\\p{IsPunctuation}\\p{IsWhite_Space}]+");
        System.out.println("words = " + Arrays.toString(words));
    }
}

输出

words = [Lorem, ipsum, dolor, sit, amet, consectetur, adipiscing, elit, sed, do]
words = [eiusmod, tempor, incididunt, ut, labore, et, dolore, magna, aliqua, Ut]
words = [enim, ad, minim, veniam, quis, nostrud, exercitation, ullamco, laboris]
words = [nisi, ut, aliquip, ex, ea, commodo, consequat]
words = []
words = []
words = [Lorem, ipsum, dolor, sit, amet, Ut, enim, ad, minim, veniam]

PS:正则表达式是从this answer借来的

【讨论】:

  • 我已经有了主要的想法,感谢您的帮助:)
【解决方案2】:

以下应该做到这一点

(?<!\s{4})\\b[A-Za-z]+\\b

它以negative lookbehind 开头,因此它不会匹配前面带有\s{4} 的任何内容。

【讨论】:

  • 它只忽略 4 个空格后的第一个单词并在此之后取走所有单词,但无论如何感谢您的帮助,现在我知道我需要阅读更多关于 negative lookbehind 的信息。我认为这是因为我在一个字符串变量中读取文本。
猜你喜欢
  • 2018-01-02
  • 1970-01-01
  • 1970-01-01
  • 2021-02-10
  • 1970-01-01
  • 2021-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多