【问题标题】:Regex to match numbers in sentence which ends with specific regex正则表达式匹配以特定正则表达式结尾的句子中的数字
【发布时间】:2017-07-27 16:31:12
【问题描述】:

我有 unpredictably 格式化句子:

Parameters: 123? ,345 abc#8678Alfa 666

我需要正则表达式匹配除以 Alfa 结尾的所有数字之外的所有数字。看似简单,但是……

这是我的尝试:

([0-9]+)(?!Alfa)

这是正则表达式的结果:

123 345 867 666

867 是我不想要的结果。

你能给我一个提示吗?

【问题讨论】:

  • 提示:word boundaries
  • @bobblebubble 它有效!谢谢!但是,如果使用“/”而不是“Alfa”,为什么它不起作用? \b([0-9]+)(?!\/)\b
  • 如果可用,您可以使用所有格量词:([0-9]++)(?!whateveryouwant),如果没有,您可以使用前瞻、捕获组和反向引用来模拟它:(?=([0-9]+))\1(?!whateveryouwant)

标签: regex


【解决方案1】:

以下正则表达式适用于您的情况

"(?![0-9]+Alfa)[0-9]+"

    String input = "Parameters: 123? ,345 abc#8678Alfa 666";

    String patternString = "(?![0-9]+Alfa)[0-9]+";

    Pattern pattern = Pattern.compile(patternString);

    Matcher matcher = pattern.matcher(input);

    while (matcher.find()) {
        System.out.println(matcher.group());
    }

// Output will be 123 345 666

?! 被称为否定前瞻,它将用于忽略遵循指定模式的字符串。更多信息here

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    对于您的负面预测,您需要锚定比赛的结束。

    使用所有格 ++ 而不是 + 将否定回溯,因此它会自动锚定到匹配结束。 (最有效,但通常不可用)

    没有所有格,使用(?!Alfa|[0-9]) 将确保您的匹配不会以Alfa 或数字的中间结尾。您还可以使用(?=[^0-9]|$) 来检查您的匹配是否没有在数字中间结束。

    【讨论】:

      【解决方案3】:

      所有格量词可以解决问题:([0-9]++)(?!Alfa)(用 perl 测试:m/([0-9]++)(?!Alfa)/g)。

      【讨论】:

      • (?<![0-9]) 无论使用何种正则表达式引擎,总是无用的。不要忘记正则表达式引擎从左到右测试字符串。另一件事,没有理由使用修饰符:xms (没有点,没有空格,没有锚点)
      • (?<![0-9]) 的负面观察不会影响结果,但在这种(可以说是病态的)情况下表现得更好:print (("0" x 100000 . "Alfa") =~ m/(?<![0-9])([0-9]++)(?!Alfa)/g)。它避免了很多回溯。
      • 确实如此,但以防万一,您可以使用以下方法避免测试所有无用位置的成本:[0-9]+(*SKIP)(?!Alfa)
      • 我不知道 (*SKIP)。感谢您的提示。
      猜你喜欢
      • 1970-01-01
      • 2015-08-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-26
      • 2011-09-23
      • 2018-10-11
      相关资源
      最近更新 更多