正则表达式测试'_'

时间:2011-04-23 10:01:42

标签: java regex

如何使用正则表达式检查'_'是否在字符串中?

例如:_a,a_ab_a_b。

3 个答案:

答案 0 :(得分:7)

使用Java,您可以使用string.contains

boolean hasUnderscore = str.contains("_");

答案 1 :(得分:1)

您使用模式

'^(?=.*_.*)$'确保'_'在字符串

'^(?!.*_.*)$''^(?=[^_]*)$'以确定它不存在

但单独使用它是没有意义的。它必须是更大模式的一部分。

修改

我必须做一个更加解释性的答案并纠正上面的模式。

我快速写了上面的答案,没有测试提出的模式。我的想法是,并且是没有理由将它们用作“裸体”,因为,正如Kobi“强调”它:),可以测试'_'没有正则表达式,所以当它是唯一的目标时,最好按照他的建议去做。

但是我写了我的答案,首先给提示者提供了一个渴望知道的提示,然后给出了允许写出更大模式的提示。

我的想法确实是这三种基本模式中的一种可以与搜索某些特定字符串的每个其他实际模式相关联。

写得太快这个答案导致我在3种模式中犯了一个错误。

我首先写了'^(?=.*_.*$)',例如。但是我在发布之前对其进行了修改,并认为应该在'^(?=.*_.*)''$'之间插入更大模式的其余部分。这是正确的,必须在结束字符'$'之前插入补码,这意味着“字符串的结尾在这里”。但事实是,3个正确模式中的每一个都必须保持'$'字符不在括号内。

“裸体”不正确的模式是:

'^(?=.*_.*)$'
'^(?!.*_.*)$'
'^(?=[^_]*)$'

正确的是:

'^(?=.*_.*$)'
'^(?!.*_.*$)'
'^(?=[^_]*$)'

然后根据你想要捕捉的内容,为他们添加互补的基本模式。

例如,如果要捕获字符串中必须没有下划线的第一个数字,则模式将为:

'^(?=[^_]*$).*?(\d+)'

并且字符串'kfgv 123 tg 4567 jkfv'中的数字'123'将被第1组捕获。

但是现在,如果你想要捕获最后一个数字(=接近字符串末尾的数字),其中一定不存在任何不受欢迎的数字,那么模式必须是:

'^(?=[^_]*$).*?(\d+)[^\d]*$'

在这种情况下,填充模式中有两个字符'$',重要的一点是'$'中存在的'^(?=[^_]*$)'是绝对必要的,因为在此处没有此字符,会有错误的结果:

'^(?=[^_]*).*?(\d+)[^\d]*$'与字符串'kfg_v 123 tg 4567 jkfv'匹配,而第1组与'4567'匹配,而不应该因为在分析的字符串中加下下划线

相反,'^(?=[^_]*$).*?(\d+)[^\d]*$'与同一个字符串不匹配,而且是针对的。

答案 2 :(得分:0)

正如Kobi所提到的,String.contains()效率更高。

但是,如果需要检查模式是否出现在String中的任何位置,以下示例将显示如何执行此操作:

Pattern p = Pattern.compile(myPattern);
Matcher m = p.matcher(stringToCheck);
if (m.find()) {
  System.out.println("String contains pattern");
}