【问题标题】:Best way to test for FOO or BAR or Foo or Bar in a regex?在正则表达式中测试 FOO 或 BAR 或 Foo 或 Bar 的最佳方法?
【发布时间】:2014-03-26 05:24:13
【问题描述】:

我正在检查作为标题的关键字,输入完全超出我的控制。

所以我发现他们会将第一个字母大写,但也可能全部大写。

我可以做一个 Java 模式:

Pattern test = Pattern.compile("\\b(FOO|BAR|Foo|Bar)\\b");

并且用它做一个模式匹配器工作正常。如:

boolean ans = test.matcher(sometext).find();

但是,当我有 6 或 8 个关键字要检查时,所有关键字都出现两次就开始变得有点难看。

谁能想出一个更优雅的正则表达式来做到这一点?

谢谢

于 2015 年 3 月 26 日添加

让我再次强调一下,这并不像最初建议的那样完全忽略大小写那么简单。第一个字母确实需要大写,字符串的其余部分可以大写也可以小写。

【问题讨论】:

  • 大多数正则表达式引擎都有一个用于 'ignorecase' 的 'i' 选项——我敢打赌 Java 也有,但我不知道它到底是什么。那会匹配太多(例如 fOo),但这是一个问题吗? [编辑:也许Pattern test = Pattern.compile("\\b(foo|bar)\\b", Pattern.CASE_INSENSITIVE);]
  • 一旦你编译了模式,通过生成的状态机有很多遍历路径并不是真正的问题(除非我们说的是数百万,这样你可能会耗尽内存)。为方便起见,您可能希望以编程方式从字符串列表生成模式,只是因为这使代码更易于维护(调试复杂正则表达式中的拼写错误令人生畏)。

标签: regex capitalization


【解决方案1】:

使用“忽略大小写”标志(?i)

Pattern test = Pattern.compile("(?i)\\b(FOO|BAR)\\b");

【讨论】:

    【解决方案2】:

    您不需要\\b\\b,因为通常出现的任何内容都被视为单词而不是字符类。

    也使用i(ignoreCase) 修饰符。

    你的正则表达式应该是:

    (foo|bar)
    

    根据您的语言添加i 修饰符

    另外,你说的是“测试”。为此使用正则表达式是多余的。

    这样做:

    String Str = new String("Welcome to Foo bar ");
    Str = Str.toLowerCase();
    return Str.contains("foo")||Str.contains("bar"); // returns true or false
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-23
      • 2014-03-20
      • 1970-01-01
      相关资源
      最近更新 更多