正则表达式:文本中的特定字符

时间:2014-03-19 13:48:47

标签: java regex

我的目标是在某些文字中验证特定字符(*,^,+,?,$,[],[^]),例如:

?test.test => true
test.test  => false

test^test => true
test:test => false

test-test$ => true
test-test  => false

我已经创建了关于上述要求的正则表达式,但我不确定。

^(.*)([\[\]\^\$\?\*\+])(.*)$

很高兴知道它是否可以通过这种方式进行优化。

3 个答案:

答案 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看到这两个例子的意思:

现在,如果你想要结合这两种方法,你可以使用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));