1

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

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

Pattern.CASE_INSENSITIVE | 模式.UNICODE_CASE | 模式.LITERAL | 图案.多线

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

提前致谢。

编辑:例如,短语:

“狗猫甜甜圈”

将导致模式:

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

4

2 回答 2

1
  1. 将用户指定的短语拆分\s+为,比如说,arr
  2. 构建以下模式:

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

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


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

\\b(Dogs cats donuts|Dogs|cats|donuts)\\b
于 2013-08-01T05:52:33.143 回答
0

尝试这个:

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
于 2013-08-01T06:00:50.633 回答