2013-06-04 147 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