当前位置: 首页 > 知识库问答 >
问题:

如何使用正则表达式在另一个单词的范围内找到一个单词?

祁烨
2023-03-14

如果我有一个字符串“word3 word2 word3 word4 word5 word3 word7 word8 word9 word10”

我想找到所有的“word3”,使其在“word5”的3个单词之内,我将得到与“word3”第二次和第三次出现的匹配

我会使用什么正则表达式或逻辑?我有两种方法,但它们对我来说效率太低了。

共有1个答案

戈曾琪
2023-03-14

您没有定义单词,因此我将把它作为单词字符序列,这是一种不完全使用正则表达式的方法,通过拆分String进行迭代:

String str = "word3 word2 word3 word4 word5 word3 word7 word8 word9 word10";
String[] words = str.split("\\W+"); for (int i = 0; i < words.length; i++) {
    // Iterate in an inner loop for nearby elements if "word5" is found.
    if (words[i].equals("word5"))
        for (int j = Math.max(0, i - 3); j < Math.min(words.length, i + 3); j++)
            if (words[j].equals("word3")) {
                // Do something with words[j] to show that you know it exists.
                // Or use it right here instead of assigning this debug value.
                words[j] = "foo";
            }
}
// Prints the result. for (final String word : words) System.out.println(word);

代码演示标准:

word3
word2
foo
word4
word5
foo
word7
word8
word9
word10

否则,以下是正则表达式的替换:

Pattern pattern = Pattern.compile("word3(?=(?:\\W*\\w++){0,2}?\\W*+word5)|(word5(?:\\W*\\w++){0,2}?\\W*+)word3");
Matcher matcher;
String str = "word3 word2 word3 word4 word5 word3 word7 word8 word9 word10";
while ((matcher = pattern.matcher(str)).find())
    // Do something with matcher.group(1) to show that you know it exists.
    // Or use it right here instead of replacing with this empty value.
    str = matcher.replaceFirst(matcher.group(1) == null ? "" : matcher.group(1));
System.out.println(str);

然而,当这个正则表达式工作时,替换掉第三个词word3认为第一个词word3可以替换掉,这就是为什么正则表达式不是这样做的原因。

代码演示标准:

 word2  word4 word5  word7 word8 word9 word10

为了使这项工作顺利进行,需要做一些小的修改:

str = matcher.replaceFirst((matcher.group(1) == null ? "" : matcher.group(1)) + "baz");
 类似资料:
  • 我的输入只能有两个值或。我可以使用什么正则表达式来确保这两个单词中的任何一个都已提交?

  • 我在寻找单词“house”和“car”时有一个要求,但它们必须在10个单词之间。我有以下正则表达式: 这适用于任何单词组合。但是,这并不满足“10字以内”的要求: 因此,以下内容将是一个很好的匹配: 但是,以下内容不应匹配: 汽车文字1文字2文字3文字4文字5文字6文字7文字8文字9文字10文字11房屋 我怎样才能做到这一点?提前感谢。

  • 我有一个文本字符串,我想用另一个使用regexp的文本替换它 指用特定单词替换的每个单词 我的预期产出 用出版物标题替换期刊 分页替换页面 年份改为出版日期 DOI替换为数字对象标识符 罗氏链环替换为罗氏链环 我的正则表达式=\b(期刊|年份|页面| DOI |罗氏链接)\b 我的regexp检测所有特定的单词,但我没有找到使用将每个单词替换为特定单词的解决方案

  • 问题内容: 考虑以下代码片段: 输出量 这种方法可能有什么问题?如果错了,那么找到确切的单词匹配的正确解决方案是什么? PS:我在这里发现了许多类似的问题,但没有一个提供我正在寻找的解决方案。提前致谢。 问题答案: 当您使用该方法时,它试图匹配整个输入。在您的示例中,输入 “ Print this” 与模式不匹配,因为单词 “ Print” 不匹配。 因此,您需要在正则表达式中添加一些内容以匹配字

  • 请考虑以下代码段: 输出 这种方法可能有什么问题?如果是错误的,那么找到精确匹配的单词的正确解决方案是什么? 附言:我在这里发现了许多类似的问题,但没有一个能提供我想要的解决方案。提前谢谢。

  • 我正在使用以替换子字符串 我现在面临的问题是,只有在字符串替换不支持的情况下,我才想要替换整个单词。< br >因为我必须替换非常非常大的字符串,可能以GB为单位。与字符串替换相比,正则表达式非常慢。< br >例如:text: - 正则表达式将时间缩短了近 100 倍(https://medium.com/codezillas/golang-replace-vs-regexp-de4e48482