如何在Java中的String.contains()方法中使用正则表达式

vip*_*169 104 java regex string

我想检查String是否按顺序包含单词"stores","store"和"product".无论他们之间是什么.

我尝试使用someString.contains(stores%store%product);.contains("stores%store%product");

我是否需要明确声明一个正则表达式并将其传递给该方法,否则我根本无法传递正则表达式?

nha*_*tdh 114

String.contains

String.contains使用String,句点.它不适用于正则表达式.它将检查指定的确切String是否出现在当前String中.

注意,String.contains不检查单词边界; 它只是检查子串.

正则表达式解决方案

正则表达式更强大String.contains,因为您可以对关键字(以及其他内容)强制执行单词边界.这意味着您可以将关键字搜索为单词,而不仅仅是子字符串.

使用String.matches以下正则表达式:

"(?s).*\\bstores\\b.*\\bstore\\b.*\\bproduct\\b.*"
Run Code Online (Sandbox Code Playgroud)

RAW正则表达式(删除字符串文字中的转义 - 这是你打印出上面的字符串时得到的):

(?s).*\bstores\b.*\bstore\b.*\bproduct\b.*
Run Code Online (Sandbox Code Playgroud)

\b一个字边界检查,这样你就不会得到匹配restores store products.请注意,stores 3store_product也被拒绝,因为数字和_被认为是单词的一部分,但我怀疑这种情况出现在自然文本中.

由于双边都检查了单词边界,因此上面的正则表达式将搜索确切的单词.换句话说,stores stores product与上面的正则表达式不匹配,因为你正在搜索store没有的单词s.

.通常匹配除了 许多新行字符之外任何字符.(?s)在开始时,.任何角色都会毫无例外地匹配(感谢Tim Pietzcker指出这一点).

  • 如果字符串包含换行符,您可能需要在正则表达式的开头添加`(?s)`. (6认同)

eug*_*e82 99

matcher.find()做你需要的.例:

Pattern.compile("stores.*store.*product").matcher(someString).find();
Run Code Online (Sandbox Code Playgroud)

  • 爱这个.我发现匹配器的正则表达式过于复杂. (2认同)

san*_*3hi 17

您可以简单地使用matchesString类的方法.

boolean result = someString.matches("stores.*store.*product.*");
Run Code Online (Sandbox Code Playgroud)

  • 你需要从`.*`开始,或者它只匹配以`stores`开头的字符串. (13认同)
  • 嗯,它只是“匹配”,但不检查字符串是否在任何位置包含该模式。这不是OP寻找的解决方案,我建议改进正则表达式。 (2认同)

P C*_*P C 6

如果您想检查字符串是否包含子字符串或不使用正则表达式,最接近的方法是使用 find() -

    private static final validPattern =   "\\bstores\\b.*\\bstore\\b.*\\bproduct\\b"
    Pattern pattern = Pattern.compile(validPattern);
    Matcher matcher = pattern.matcher(inputString);
    System.out.print(matcher.find()); // should print true or false.
Run Code Online (Sandbox Code Playgroud)

请注意 matches() 和 find() 之间的区别,如果整个字符串与给定模式匹配,matches() 返回 true。find() 尝试查找与给定输入字符串中的模式匹配的子字符串。另外,通过使用 find(),您不必在正则表达式模式的开头添加额外的匹配,例如 - (?s).* 和结尾的 .* 。