正则表达式匹配不包含其他模式的模式

时间:2016-12-13 22:01:14

标签: java regex string conditional-statements contain

我理解只包含数字的正则表达式的过程,但我如何为其添加另一个条件,使得它不能包含某个子字符串。例如,匹配仅包含数字但不包含子字符串456的输入的正则表达式。

给定此输入(其中<empty>为空字符串""):

0
1456
<empty>
12345689
1010101
abc

这些,只有这些应该匹配:

0
<empty>
1010101

有人可以为此解释正则表达式吗?

4 个答案:

答案 0 :(得分:2)

您可以使用负前瞻使用此正则表达式:

^(?![0-9]*456)[0-9]*$

RegEx Demo

  • (?![0-9a-zA-Z]*456)在单词中禁用456是否定的预测。

答案 1 :(得分:2)

我认为这就是你要找的东西:

public static void main(String[] args) {
    String regex = "^((?!456)\\d)*$";
    String test = "123";
    String test2 = "456";
    String test3 = "asdf123";
    String test4 = "test456asdf";

    System.out.println(test.matches(regex)); // True
    System.out.println(test2.matches(regex)); // False
    System.out.println(test3.matches(regex)); // False
    System.out.println(test4.matches(regex)); // False
}

那是:

  • 字符串的开头
  • 零次或多次
    • 看看从这里开始的三个字符,如果它是“456”
    • 则不匹配
    • 匹配一位数字
  • 字符串结尾

这是指向fiddle的链接,您也可以在其中测试epsilon字符。

答案 2 :(得分:1)

使用负面预测锚定开始,并匹配&#34;数字&#34;:

<a id="scroll-src-{{ term.id }}" class="content-scroll button" data-id="{{ term.id }}">
<!-- other page content -->
<div id="scroll-dest-{{ term.id }}" class="content-scroll"></div>



if($('.content-scroll').length) {
    $('.button').click(function() {
        $('html, body').animate({
           scrollTop: $('#scroll-dest-'+$(this).data('id')).offset().top - 87
         }, 750);
    });
}

答案 3 :(得分:0)

我认为这样做没有任何“花哨”的正则表达式功能,例如负向前瞻。

^([0-35-9]*|4[0-46-9]|45[0-57-9]|4$|45$)*$

那是:

  • 开始
    • 任意数量:
      • 不包括4
      • 的数字序列
      • 或以“4”开头的2个字符编号,但不是“45”
      • 或以“45”开头的3个字符编号,但不是“456”
      • 或4后跟结束
      • 或45后跟结束

这与正则表达式作为有限状态机的属性一致。我们已明确处理了三个州 - (“未见4”,“见4”,“见45”)。如果我们希望我们的“不匹配”字符串为“4567”,我们必须明确添加另一个状态,使模式更长,状态机更大。

这是否符合您的需求取决于测试的目的 - 熟悉Java正则表达方言的高级功能,或普遍应用正则表达式的能力(例如基本grepbash)。

否定的前瞻,让你更简洁地表达这一点。

^((!?456)\d)*$

那是(围绕它的开始和结束锚点),一个char模式的零次或多次重复:(!?456)\d这意味着“不是456的开始(未实际消费时向前看)并匹配一个数字字符。“

要处理这个问题,正则表达式引擎只需要在当前字符之前查看3个字符,这使其成为满足要求的有效的一次通过方式。