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,然后是结束
- 任何数量的:
- 结束
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,然后是结束
- 任何数量的:
- 结束
grep
,bash
)
负面表情,让你表达得更简洁
^((!?456)\d)*$
也就是说(在其周围有开始和结束锚定),一个字符模式的零次或多次重复:(!?456)\d
,这意味着“不是456
的开始(向前看而不实际使用),并匹配一个数字字符。”
要处理这一点,正则表达式引擎只需要在当前角色前面查看3个字符,这是满足要求的一种有效的单向方式 你的正则表达式是什么?这很难做到。但你为什么要这么做?编写“普通”代码来进行检查要容易得多。我正在准备一个测试,这是前几年测试中的一个问题。显式声明必须用正则表达式编写。我不相信有一个正则表达式可以表达这一点。@b纯正则表达式(即,即使是没有非贪婪匹配器等“奇特”功能的方言)编译成一个完全成熟的有限状态机。因为你只需要向前看三个字符就可以找到一个不匹配,我们知道我们可以用有限状态来解决这个问题,所以这肯定是可能的,但可能是冗长的。使用非贪婪的匹配器和消极的lookaheads,它可以简洁地表达(虽然不一定容易理解)。你的正则表达式是什么?这可以很难做到。但你为什么要这么做?编写“普通”代码来进行检查要容易得多。我正在准备一个测试,这是前几年测试中的一个问题。显式声明必须用正则表达式编写。我不相信有一个正则表达式可以表达这一点。@b纯正则表达式(即,即使是没有非贪婪匹配器等“奇特”功能的方言)编译成一个完全成熟的有限状态机。因为你只需要看看