【问题标题】:Java Regex: Match any word from patternJava Regex:匹配模式中的任何单词
【发布时间】:2013-08-01 05:41:13
【问题描述】:

我正在尝试实现搜索功能。 用户键入一个短语,我想在字符串数组中匹配短语中的任何单词和短语本身。 问题是该短语存储在一个变量中,因此Pattern.compile 方法不会解释其特殊字符。

我在编译方法中使用了以下标志:

Pattern.CASE_INSENSITIVE |模式.UNICODE_CASE |模式.LITERAL | Pattern.MULTILINE

我怎样才能达到预期的效果?

提前致谢。

编辑: 例如,短语:

“狗猫甜甜圈”

将导致模式:

狗 |猫 |甜甜圈 |狗猫甜甜圈

【问题讨论】:

  • 编辑添加示例。

标签: java regex


【解决方案1】:
  1. \s+ 的用户指定短语拆分为arr
  2. 构建以下模式:

    "\\b(?:" + Pattern.quote(arr[0]) + "|" + Pattern.quote(arr[1]) + "|" + Pattern.quote(arr[2]) + ... + "\\b"
  3. 编译没有Pattern.LITERAL选项。

换句话说,如果你希望你的模式匹配用户指定短语中的单词,你必须使用alternation(管道),这样任何一个这些词可以被认为是匹配的。但是,使用Pattern.LITERAL 选项会使交替运算符变成文字——因此您必须使用Pattern.quote(...) 方法仅将单词本身“文字化”。 \\b单词边界,因此当遇到诸如“barrage”之类的文本时,您不会匹配用户短语中的诸如“bar”之类的单词。


编辑。响应您的编辑。如果你想匹配最长的匹配,例如不是“Dogs”和“cats”和“donuts”而是“Dogs cat donuts”,你应该把完整的短语放在交替的开头系列,例如

\\b(Dogs cats donuts|Dogs|cats|donuts)\\b

【讨论】:

  • 在正则表达式字符串的最后部分缺少一个 ')'。
【解决方案2】:

试试这个:

String regex = "\\b(" + phrase + "|" + phrase.replaceAll("\\s+", "|") + ")\\b"; 

在行动:

String phrase = "Dog cats donuts";
String regex = "\\b(" + phrase + "|" + phrase.replaceAll("\\s+", "|") + ")\\b"; 
System.out.println(regex);

输出:

\b(Dog cats donuts|Dog|cats|donuts)\b

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 1970-01-01
    相关资源
    最近更新 更多