【问题标题】:Regex with case insensitive prefix带有不区分大小写前缀的正则表达式
【发布时间】:2015-10-16 05:30:52
【问题描述】:

我正在尝试创建一个不区分大小写前缀的正则表达式。我有以下内容,但我不确定这是否正确:

String value1 = "97 ebt ue i ua so sufi iqc k";
String pattern1 = "(?=(\\b(?i:.*s.*)))(?=(\\b(?i:.*q.*)))";

在我的示例中,我试图在 value1 中找到 pattern1 的匹配项。据我了解:

  1. \\b 匹配字符串中的任何单词
  2. :.*.* 不区分大小写

这在某些情况下有效,但在其他情况下失败。我无法弄清楚这个问题。

更新:

这里的情况返回真,但它应该返回假。问题是应该有任何以s 结尾的词和另一个以q 结尾的词,所以因为它们中的任何一个都没有结尾,所以它应该失败。

【问题讨论】:

  • 您要查找的输出是什么? \\b 只是一个词的边界,它不匹配一个词。 (?i) 只能在开头使用一次,整个模式不区分大小写。
  • 适用和失败的情况是什么。能举几个例子吗?
  • 我已经更新了我的问题
  • 请发布完整的相关代码。
  • 如果您要查找“以 s 结尾”和“以 q 结尾”,那么在每个模式组的末尾加上 .* 似乎是错误的,因为您还将匹配任何带有 s 或q 在中间。

标签: java regex pattern-matching


【解决方案1】:

\\b 结构只是一个单词边界,它不匹配单词。

(?i) 只能在开头使用一次,整个模式不区分大小写。

问题是应该有任何以s 结尾的词和另一个以q 结尾的词,所以因为它们中的任何一个都没有结尾,所以它应该失败

使用

(?Ui)^(?=.*s\\b)(?=.*q\\b)

在这里,我们有两个锚定的前瞻,需要在输入字符串中以 qs 结尾的 2 个单词(不区分大小写)。

这里是code demo

String value1 = "97 ebts ue i ua so sufi iqc k";
String pattern1 = "(?Ui)^(?=.*s\\b)(?=.*q\\b)";
Pattern ptrn = Pattern.compile(pattern1);
Matcher matcher = ptrn.matcher(value1);
if (matcher.find())
    System.out.println("true");
else
    System.out.println("false");

如果您想知道 ?U 的含义是什么,它只是“修复”了 Unicode 字符串中的 \b 字边界。如果您不使用拉丁语以外的任何字母,则可以删除U

【讨论】:

    猜你喜欢
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 2016-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    相关资源
    最近更新 更多