我的目标是在某些文字中验证特定字符(*,^,+,?,$,[],[^]),例如:
?test.test => true
test.test => false
test^test => true
test:test => false
test-test$ => true
test-test => false
我已经创建了关于上述要求的正则表达式,但我不确定。
^(.*)([\[\]\^\$\?\*\+])(.*)$
很高兴知道它是否可以通过这种方式进行优化。
答案 0 :(得分:2)
您的正则表达式已经过优化,非常简单。你可以使它更简单或只是可读。
此外,如果您使用Java matches()
课程的String
方法,那么您在两端都不需要^
和$
.*([\\[\\]^$?*+]).*
Java的双斜杠(\\
),否则请使用单斜杠(\
)。
请注意,我已删除了捕获()
以及字符\
中的转义字符^$?*+
,因为它们位于字符类[]
内。
答案 1 :(得分:2)
<强> TL; DR 强>
最快的正则表达式是
# ^[^\]\[^$?*+]*([\]\[^$?*+])
^ #start of the string
[^ #any character BUT...
\]\[^$?*+ #...these ones (^$?*+ aren't special inside a character class)
]*+ #zero or more times (possessive quantifier)
([ #capture any of...
\]\[^$?*+ #...these characters
])
请注意,在java字符串中,您还需要转义\
,因此您应该将每个\
转换为\\
。
<强>讨论强>
首先要记住两个正则表达式:
[\]\[^$?*+]
,它只匹配字符串中您想要的字符。^.*[\]\[^$?*+]
,它会将您的字符串与所需的字符匹配。理解开头的.*
案例和完全没有通配符的案例之间的区别实际上非常重要。
搜索模式时,第一个.*
将使正则表达式引擎吃掉所有字符串,然后逐个字符地回溯以查看它是否与您的角色匹配范围[...]
。因此,正则表达式实际上将从字符串的末尾搜索。
当你想要的标志接近结束时,这是一个优势,当它在开始时是一个缺点。
在另一种情况下,正则表达式引擎将从左侧开始尝试每个角色,直到它符合您的要求。
你可以从优秀的regex101.com看到这两个例子的意思:
.*
,匹配在开头附近的26个步骤中找到,8在接近开头时找到:http://regex101.com/r/oI3pS1/#debugger 现在,如果你想要结合这两种方法,你可以使用tl;博士回答:你吃了不是你的角色的所有东西,然后你匹配你的角色(如果你的角色匹配没有一个。)
在our example上,无论你的角色在字符串中的哪个位置都需要7步(即使没有角色也需要7步,这要归功于占有量词)。
答案 2 :(得分:1)
这也应该有效:
String regex = ".*[\\[\\]^$?*+].*";
String test1 = "?test.test";
String test2 = "test.test";
String test3 = "test^test";
String test4 = "test:test";
String test5 = "test-test$";
String test6 = "test-test";
System.out.println(test1.matches(regex));
System.out.println(test2.matches(regex));
System.out.println(test3.matches(regex));
System.out.println(test4.matches(regex));
System.out.println(test5.matches(regex));
System.out.println(test6.matches(regex));