我想在字符串中找到一个字符串,这是我的情况:
String toMatch = "ABC";
String matchIn = "ABC*FED";
matchIn的其他变体:
matchIn = "ABC";
matchIn = "ASD*ABC";
matchIn = "JULY*ABC*RTEW";
我想出了这个正则表达式,但显然不起作用:
matchIn.matches(".*(\\*)?" + toMatch + "(\\*)?.*");
这里的问题是,我不知道只有在"*"
后跟另一个单词时才寻找它。这样,它可以匹配所有内容,例如,
toMatch="ABCDEF"
不应该返回true!
答案 0 :(得分:1)
您可以使用正则表达式,例如
(?<=^|\*)ABC(?=$|\*)
或
(?<![^*])ABC(?![^*])
请参见regex demo。
详细信息
(?<=^|\*)
-向后的正向查找,要求在字符串(^
或(|
)的开头处放置一个*
符号,该符号应立即出现在左侧当前位置的位置(请注意,(?<![^*])
是等效的 negative 后向构造,它匹配的位置不是紧跟在任何字符之前的任何位置,而是*
,因此它意味着与(?<=^|\*)
相同)ABC
-文字字符串模式(ABC
)(?=$|\*)
-当前行右边(即,ABC
之后)的正向搜索,要求字符串结尾($
)或{ {1}}字符(等同于否定的前瞻性*
)。请注意,带有负向后视的变体更为有效,因为在这些环视中内部没有任何交替(成本比它高)。
与(?<![^*])ABC(?![^*])
一起使用以检查部分匹配项(带有.find()
的正则表达式效率太低):
.*
输出:
List<String> strs = Arrays.asList("ABC", "ASD*ABC", "JULY*ABC*RTEW", "ASDABC");
Pattern p = Pattern.compile("(?<=^|\\*)ABC(?=$|\\*)");
for (String str : strs) {
Matcher m = p.matcher(str);
System.out.println("\"" + str + "\" => " + m.find());
}
请参见Java demo。