2013-06-04 151 views
2

我是新来的正则表达式。在过去几个小时里,我一直在阅读有关正则表达式的知识,以了解如何使用正则表达式*来实现以下内容,但运气不多。我的大脑开始受伤了。因此请求帮助。以下是我想要应用于数据输入字段的限制,我应该使用什么正则表达式?限制输入数据

  1. 第一个和最后一个字符应该是字母数字,“。” (即点)或“_”(即下划线)
  2. 第一个和最后一个字符之间的字符可以是字母数字,“。” (即点),“_”(即下划线)或“ - ”(即连字符)
  3. 字符“。” (即点)和“ - ”(即连字符)不能连续出现。
  4. 输入中应该至少有一个字母数字字符。

一些有效的输入数据:

.abc_ 
__abc.d-e. 
.__a. 
.a__b. 
_a-b. 
abc 
a___. 

感谢和问候,

〜插上

  • 我使用的是内部使用提高正则表达式解析第三方库表达方式。
+1

现在听起来,它看起来像一些[莫尔斯电码](http://en.wikipedia。org/wiki/Morse_code)o_o你能提供一个样本吗? – HamZa

+0

@HamZa完成!增加了几个样本输入文本。 – user1937634

+0

我不相信这是可能的正则表达式。至少不容易。 –

回答

2

你应该真的展示你到目前为止所展示的内容。

这就是说,一个正则表达式来覆盖你的限制应该看起来有点像这样:

^[a-zA-Z0-9\._](?:[a-zA-Z0-9_]*(?:\.(?!\.))*(?:-(?!-))*[a-zA-Z0-9_]*)*[a-zA-Z0-9\._]$ 

有人很可能有更好的格式化的一个一起走,但它似乎在http://www.regex101.com/工作的一切我已经测试过它在。

+1

我已经对您的正则表达式进行了修改,它处理规则3的第一个和最后一个字符,并且还规则4(通过积极的向前看)。^(?=。* [[:alnum:]])[[:alnum:] _。](?:[[:alnum:] _] |(?<! \。)。\ - (?! - ))*(?:[[:alnum:] _] |(?<!\。)\。)$' – Hasturkun

+0

上面的正则表达式工作正常,但当它不匹配时可以很容易地进入[灾难性回溯](http://www.regular-expressions.info/catastrophic.html)。即它具有经典的形式:'^(a * a *)* $',并且当应用于字符串“aaaaaaaaaab”时,需要许多_many_迭代来声明匹配失败。 – ridgerunner

2

这与一个单一的正则表达式非常混乱。实际上并不是不可能的,但你会疯狂地做这件事,这样你最好写一个状态机。但是,通过一系列正则表达式测试很容易做到这一点。

对于你的条件1和2中的文本应符合以下(允许该文本可能只有一个字符长):

^([a-z0-9._]|[a-z0-9._][a-z0-9_.-]*[a-z0-9._])$ 

对于你的条件3中,文本应该匹配的一个这些正则表达式(根据情况选择,你的规范不太清楚)。

.*[.-][.-].* 
.*(.-|-.).* 
.*(\.\.|--).* 

为了您的条件4,文字应符合以下几点:

.*[a-z0-9].* 

我还没有允许大写字符在这里。如果需要,将这些添加到字符模式中。

0

有趣的问题。可以用一个不平凡的正则表达式解决。这里是Java语法(它要求将正则表达式包含在一个字符串中)。

Pattern re_valid = Pattern.compile(
    " # Regex to validate special word requirements.         \n" + 
    " ^       # Anchor to start of string. And...    \n" + 
    " (?=[A-Za-z0-9._])    # First char is alphanum, dot or underscore. And...\n" + 
    " (?=.*[A-Za-z0-9._]$)   # Last char is alphanum, dot or underscore. And... \n" + 
    " (?=[^A-Za-z0-9]*[A-Za-z0-9]) # Contains at least one alphanum.     \n" + 
    " (?:       # Group two possible content formats.    \n" + 
    "  [A-Za-z0-9_]+    # Case 1: Begins with one or more non-[-.].  \n" + 
    "  (?:       # Zero or more [-.] separated parts.    \n" + 
    "  [-.]      # Each part separated by one [-.],     \n" + 
    "  [A-Za-z0-9_]+    # followed by one or more non-[-.].    \n" + 
    "  )*       # Zero or more [-.] separated parts.    \n" + 
    "  [.]?      # May end with one [-.].       \n" + 
    " | [.]       # Or Case 2: Begins with hyphen or dot.   \n" + 
    "  (?:       # Zero or more [-.] separated parts.    \n" + 
    "  [A-Za-z0-9_]+    # One or more non-[-.],       \n" + 
    "  [-.]      # followed by one [-.].       \n" + 
    "  )*       # Zero or more [-.] separated parts.    \n" + 
    "  [A-Za-z0-9_]*    # May end with zero or more non-[-.].    \n" + 
    " )        # End group of two content alternatives.   \n" + 
    " $        # Anchor to end of string.       ", 
    Pattern.COMMENTS); 
+0

要获得额外的荣誉,请将其写入,以便从开始到结束处理输入,而不回溯。 – mc0e