Java String Regex具有多级条件

时间:2018-08-13 19:06:31

标签: java regex string

我想在字符串中找到一个字符串,这是我的情况:

String toMatch = "ABC";
String matchIn = "ABC*FED";

matchIn的其他变体:

matchIn = "ABC";
matchIn = "ASD*ABC";
matchIn = "JULY*ABC*RTEW";

我想出了这个正则表达式,但显然不起作用:

matchIn.matches(".*(\\*)?" + toMatch + "(\\*)?.*");

这里的问题是,我不知道只有在"*"后跟另一个单词时才寻找它。这样,它可以匹配所有内容,例如, toMatch="ABCDEF"不应该返回true!

1 个答案:

答案 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