Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正则表达式匹配的模式不';不包括其他模式_Java_Regex_String_Conditional Statements_Contain - Fatal编程技术网

Java 正则表达式匹配的模式不';不包括其他模式

Java 正则表达式匹配的模式不';不包括其他模式,java,regex,string,conditional-statements,contain,Java,Regex,String,Conditional Statements,Contain,我理解只包含数字的正则表达式的处理过程,但我如何向其添加另一个条件,使其不能包含某个子字符串。例如,与只包含数字而不包含子字符串的输入匹配的正则表达式456 给定此输入(其中是空字符串“”): 0 1456 12345689 1010101 abc 这些和只有这些应该匹配: 0 <empty> 1010101 0 1010101 有人能解释一下正则表达式吗 您可以使用负前瞻使用此正则表达式: ^(?![0-9]*456)[0-9]*$ (?![0-9a-zA-Z]*456

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

给定此输入(其中
是空字符串
“”
):

0
1456
12345689
1010101
abc
这些和只有这些应该匹配:

0
<empty>
1010101
0
1010101

有人能解释一下正则表达式吗

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

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

  • (?![0-9a-zA-Z]*456)
    是否定的前瞻,禁止单词中的
    456

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

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

  • (?![0-9a-zA-Z]*456)
    是否定的前瞻,禁止单词中的
    456

使用锚定为开始的负前瞻,并匹配“数字”:


使用锚定的负前瞻开始,并匹配“数字”:


我想这就是你想要的:

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”,则不匹配
    • 匹配一个数字
  • 结束

这里有一个链接,您可以在其中测试epsilon字符。

我想这就是您想要的:

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”,则不匹配
    • 匹配一个数字
  • 结束

这里有一个链接,您可以在其中测试epsilon字符。

我认为这不需要任何“花哨”的正则表达式特性,比如负前瞻

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

  • 开始
    • 任何数量的:
      • 不包括4的数字序列
      • 或以“4”开头的2个字符的数字,但不是“45”
      • 或以“45”开头的3个字符的数字,但不是“456”
      • 或者是4,然后是结束
      • 或者是45,然后是结束
  • 结束
这与regex作为有限状态机的特性是一致的。我们明确地处理了三个州(“没有看到4”,“看到4”,“看到45”)。如果我们希望“不匹配”字符串为“4567”,我们必须显式地添加另一个状态,使模式更长,状态机更大

这是否满足您的需要取决于测试所寻找的内容——熟悉Java正则表达式方言的高级功能,或者能够普遍应用正则表达式(例如basic
grep
bash

负面表情,让你表达得更简洁

^((!?456)\d)*$
也就是说(在其周围有开始和结束锚定),一个字符模式的零次或多次重复:
(!?456)\d
,这意味着“不是
456
的开始(向前看而不实际使用),并匹配一个数字字符。”


要处理这一点,正则表达式引擎只需要在当前角色前面查看3个字符,这是满足要求的一种有效的单向方式

我认为这在没有任何“花哨”的正则表达式特性(如负前瞻性)的情况下工作

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

  • 开始
    • 任何数量的:
      • 不包括4的数字序列
      • 或以“4”开头的2个字符的数字,但不是“45”
      • 或以“45”开头的3个字符的数字,但不是“456”
      • 或者是4,然后是结束
      • 或者是45,然后是结束
  • 结束
这与regex作为有限状态机的特性是一致的。我们明确地处理了三个州(“没有看到4”,“看到4”,“看到45”)。如果我们希望“不匹配”字符串为“4567”,我们必须显式地添加另一个状态,使模式更长,状态机更大

这是否满足您的需要取决于测试所寻找的内容——熟悉Java正则表达式方言的高级功能,或者能够普遍应用正则表达式(例如basic
grep
bash

负面表情,让你表达得更简洁

^((!?456)\d)*$
也就是说(在其周围有开始和结束锚定),一个字符模式的零次或多次重复:
(!?456)\d
,这意味着“不是
456
的开始(向前看而不实际使用),并匹配一个数字字符。”


要处理这一点,正则表达式引擎只需要在当前角色前面查看3个字符,这是满足要求的一种有效的单向方式

你的正则表达式是什么?这很难做到。但你为什么要这么做?编写“普通”代码来进行检查要容易得多。我正在准备一个测试,这是前几年测试中的一个问题。显式声明必须用正则表达式编写。我不相信有一个正则表达式可以表达这一点。@b纯正则表达式(即,即使是没有非贪婪匹配器等“奇特”功能的方言)编译成一个完全成熟的有限状态机。因为你只需要向前看三个字符就可以找到一个不匹配,我们知道我们可以用有限状态来解决这个问题,所以这肯定是可能的,但可能是冗长的。使用非贪婪的匹配器和消极的lookaheads,它可以简洁地表达(虽然不一定容易理解)。你的正则表达式是什么?这可以很难做到。但你为什么要这么做?编写“普通”代码来进行检查要容易得多。我正在准备一个测试,这是前几年测试中的一个问题。显式声明必须用正则表达式编写。我不相信有一个正则表达式可以表达这一点。@b纯正则表达式(即,即使是没有非贪婪匹配器等“奇特”功能的方言)编译成一个完全成熟的有限状态机。因为你只需要看看