我理解只包含数字的正则表达式的过程,但我如何为其添加另一个条件,使得它不能包含某个子字符串。例如,匹配仅包含数字但不包含子字符串456
的输入的正则表达式。
给定此输入(其中<empty>
为空字符串""
):
0
1456
<empty>
12345689
1010101
abc
这些,只有这些应该匹配:
0
<empty>
1010101
有人可以为此解释正则表达式吗?
答案 0 :(得分:2)
答案 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
}
那是:
这是指向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”,“见45”)。如果我们希望我们的“不匹配”字符串为“4567”,我们必须明确添加另一个状态,使模式更长,状态机更大。
这是否符合您的需求取决于测试的目的 - 熟悉Java正则表达方言的高级功能,或普遍应用正则表达式的能力(例如基本grep
,bash
)。
否定的前瞻,让你更简洁地表达这一点。
^((!?456)\d)*$
那是(围绕它的开始和结束锚点),一个char模式的零次或多次重复:(!?456)\d
这意味着“不是456
的开始(未实际消费时向前看)并匹配一个数字字符。“
要处理这个问题,正则表达式引擎只需要在当前字符之前查看3个字符,这使其成为满足要求的有效的一次通过方式。