正则表达式只允许1个短划线

时间:2012-03-21 17:22:24

标签: java regex

我有一个文本框,我在其中获取用户的姓氏。如何在正则表达式中只允许一个短划线( - )?并且它不应该在字符串的开头或结尾 我有这段代码:

          Pattern p = Pattern.compile("[^a-z-']", Pattern.CASE_INSENSITIVE);
          Matcher m = p.matcher(name);

5 个答案:

答案 0 :(得分:2)

尝试用更多的regexy术语来重新解释这个问题。你可以说,不是“只允许一个短划线,也不能在开头”,“字符串的开头,然后是至少一个非短划线,然后是一个短划线,接着是至少一个非破折号,然后是字符串的结尾。“

  • 字符串的开头:`^
  • 至少一个非破折号:[^-]+
  • 后跟一个破折号:-
  • 后跟至少一个非破折号:[^-]+
  • 后跟字符串的结尾:$

把所有这些放在一起,你就去了。如果你在与完整字符串匹配的上下文中使用它(不仅仅是其中的任何子字符串),你就不需要锚点 - 尽管最好把它们放在一起,以防你以后使用它在子字符串匹配上下文中的正则表达式并忘记将它们添加回来。

答案 1 :(得分:2)

为什么不在indexOf()中使用String

String s = "last-name";
int first = s.indexOf('-');
int last = s.lastIndexOf('-');

if(first == 0 || last == s.length()-1) // Checks if a dash is at the beginning or end
    System.out.println("BAD");
if(first != last) // Checks if there is more than one dash
    System.out.println("BAD");

它比使用正则表达式慢,但通常使用较小的姓氏,它应该是最不明显的。此外,它将使调试和未来的维护更容易。

答案 2 :(得分:0)

此正则表达式代表一个或多个非连字符,后跟一个连字符,后跟一个或多个非连字符

^[^\-]+\-[^\-]+$

我不确定中间的连字符是否需要使用反斜杠进行转义...这可能取决于您使用正则表达式的平台。

答案 3 :(得分:0)

您的正则表达式代表无效值的一个片段,您可能正在使用Matcher.find()来查找任何部分值是否匹配那个正则表达式。那是对的吗?如果是这样,您可以将模式更改为:

Pattern p = Pattern.compile("[^a-zA-Z'-]|-.*-|^-|-$");

将匹配非字母 - 非连字符 - 非撇号字符,一系列以连字符开头和结尾的字符(从而检测包含两个连字符的值), 一个前导连字符,一个尾随连字符。

答案 4 :(得分:0)

尝试类似[a-z] - [a-z] 的模式。

  

模式p = Pattern.compile(“[a-z] - [a-z] ”);