我正在尝试实现搜索功能。用户键入一个短语,我想在字符串数组中匹配短语中的任何单词和短语本身。问题是短语存储在变量中,因此该Pattern.compile
方法不会解释其特殊字符。
我在编译方法中使用了以下标志:
Pattern.CASE_INSENSITIVE | 模式.UNICODE_CASE | 模式.LITERAL | 图案.多线
我怎样才能达到预期的结果?
提前致谢。
编辑:例如,短语:
“狗猫甜甜圈”
将导致模式:
狗 | 猫 | 甜甜圈 | 狗猫甜甜圈
\s+
为,比如说,arr
。构建以下模式:
"\\b(?:" + Pattern.quote(arr[0]) + "|" + Pattern.quote(arr[1]) + "|" + Pattern.quote(arr[2]) + ... + "\\b"
不带选项Pattern.LITERAL
编译。
换句话说,如果您希望您的模式匹配用户指定短语中的单词,您必须使用交替(管道),以便这些单词中的任何一个都可以被视为匹配。但是,使用该选项会使交替运算符变为文字 - 因此您必须使用该方法Pattern.LITERAL
仅“文字化”单词本身。Pattern.quote(...)
这些\\b
是单词边界,因此当遇到诸如“barrage”之类的文本时,您不会匹配用户短语中的诸如“bar”之类的单词。
编辑。回应您的编辑。如果你想匹配最长的匹配,例如不是“Dogs”和“cats”和“donuts”而是“Dogs cat donuts”,你应该把完整的短语放在交替系列的开头,例如
\\b(Dogs cats donuts|Dogs|cats|donuts)\\b
尝试这个:
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