【问题标题】:Android - Java - Regular Expression question - consecutive words not being matchedAndroid - Java - 正则表达式问题 - 连续单词不匹配
【发布时间】:2010-12-28 18:01:27
【问题描述】:

对于我的示例,我试图用空格替换字符串中所有“the”和“a”的情况。 包括这些单词与引号和其他标点符号等字符相邻的情况

String oldString = "A test of the exp."
Pattern p = Pattern.compile("(((\\W|\\A)the(\\W|\\Z))|((\\W|\\A)a(\\W|\\Z)))",Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(oldString);
newString = m.replaceAll(" ");

“对 exp 的测试。”返回“exp 的测试”。 - 是的!

“a exp 的测试。”返回“exp 的测试”。 - 嘘!

"这个测试中的 a 是 the。"返回“此测试中的 a 是。-DoubleBoooo!

任何帮助将不胜感激。 谢谢!

【问题讨论】:

  • 不需要将“Android - Java - 正则表达式”作为问题的一部分,这就是标签的用途。

标签: java android regex


【解决方案1】:
String resultString = subjectString.replaceAll("\\b(?:a|the)\\b", " ");

\b 匹配单词边界(即单词的开头或结尾,其中“单词”是字母数字字符序列)。

(?:...) 是一个非捕获组,需要将替代词(在本例中为 athe)与周围的词边界锚分开。

【讨论】:

  • 是的!感谢您提供有关 (?:...) 非捕获组的额外信息。阅读后:regular-expressions.info/brackets.html我现在知道这让我的表达效率稍微高了一点。我还在使用 Pattern+Matcher,因为我将多次使用这个表达式,并且文档说它比 String 函数更有效,特别是如果要多次使用相同的模式。再次感谢!
【解决方案2】:

或每个简化的@Robokop 解决方案。

Pattern.compile("(\\b(the|a)\\b)",Pattern.CASE_INSENSITIVE);

Pattern.compile('\b(the|a)\b',Pattern.CASE_INSENSITIVE);

不确定是否要在 Java 中引用。

【讨论】:

  • 第一个版本是正确的。 Java 字符串文字总是双引号,如果你想让它们出现在正则表达式中,你总是必须转义反斜杠。
【解决方案3】:
Pattern.compile("(\\bthe\\b)|(\\ba\\b)",Pattern.CASE_INSENSITIVE);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-13
    • 1970-01-01
    • 1970-01-01
    • 2013-07-09
    • 1970-01-01
    • 2011-09-20
    相关资源
    最近更新 更多