2013-05-02 143 views
-1

我有一個字符串,它看起來像這樣:正則表達式匹配的是數字,而不是字母

[IF-ABC] 12345 [IF-DEF] 67890 [/ IF] [/ IF]

我有以下的正則表達式:

/\[if-([a-z0-9-]*)\]([^\[if]*?)\[\/if\]/s 

此相匹配的內部支架,就像我想它。但是,當我用文本替換67890(即。abcdef)時,它與它不匹配。

[如果-ABC] 12345 [如果清晰度] ABCDEF [/如果] [/如果]

我希望能夠匹配任何字符,包括換行,除另一個開口支架[if-

+0

不寫「我」或者是「F」一文中,它會工作。你的正則表達式有一個錯誤 – DhruvPathak 2013-05-02 19:49:14

回答

1

像你想象的那樣這部分不工作:

[^\[if] 

這將匹配單個字符,既不的[if。無論何種組合。您可以使用negative lookahead雖然模仿所需的行爲:

~\[if-([a-z0-9-]*)\]((?:(?!\[/?if).)*)\[/if\]~s 

我還包含在先行結束標籤,因爲這避免了重複ungreedy(通常是糟糕的性能代價)。另外,我更改了分隔符,這樣你就不必在模式中逃避斜線。

所以這是最有趣的部分((?:(?!\[/?if).)*)解釋說:

(  # capture the contents of the tag-pair 
    (?:  # start a non-capturing group (the ?: are just a performance 
      # optimization). this group represents a single "allowed" character 
    (?! # negative lookahead - makes sure that the next character does not mark 
      # the start of either [if or [/if (the negative lookahead will cause 
      # the entire pattern to fail if its contents match) 
     \[/?if 
      # match [if or [/if 
    )  # end of lookahead 
    .  # consume/match any single character 
)*  # end of group - repeat 0 or more times 
)   # end of capturing group 
+0

您的功能有效,謝謝..也感謝您的解釋,我將不得不經過幾次才能得到它 – user2103849 2013-05-02 20:18:38

-1

使用句點來匹配任何字符。

+1

使用一段時間,爲什麼使用一段時間 - 它有什麼作用?這將如何改變? – 2013-05-02 19:56:57

+0

仔細閱讀我的評論。 「用一段時間來匹配任何角色」。所以,根據你的問題「我想匹配任何角色」,你會使用一段時間「。」匹配任何字符。雖然根據您的評論,我強烈建議您回去閱讀相應的正則表達式手冊。 – Chad 2013-05-03 00:01:44

+0

我在發表評論以備份我應用於答案的downvote。 「使用一段時間來匹配任何角色」幾乎不能解決所提出的問題,而只能處理帖子中的一小部分文字。 – 2013-05-03 04:20:09

0

修改一點點結果:

/\[if-([a-z0-9-]+)\](.+?)(?=\[if)/s 

上運行它[if-abc] 12345 [if-def] abcdef [/if][/if]

結果在第一場比賽爲:[if-abc] 12345

你的組是:abc12345

和修改更進一步:

/\[if-([a-z0-9-]+)\](.+?)(?=(?:\[\/?if))/s 

與兩組相匹配。儘管分號[/if]未被其中任何一個捕獲。

注:取而代之的匹配定界符我在正則表達式中使用一個超前((?=))停止當文本的前瞻未來相匹配。

+0

我認爲目標是隻匹配內部對,而不是外部或兩者。 – 2013-05-02 19:55:43

+0

@ m.buettner爲什麼只匹配一個正則表達式,當你可以匹配多個?他有一個以上的字符串,所以需要在某個時候匹配。 – 2013-05-02 19:57:47

+0

這是一個嵌套結構......所以匹配'[if-abc] 12345'似乎對我來說是一個不完整/無用的匹配。由於在正則表達式中計算嵌套級別是不可能的,因此只匹配最內層的對(可以用其他方式替換以便能夠重複該過程並從內到外工作)是有意義的。另外,這只是OP在問題中指定的內容。 – 2013-05-02 20:02:12

相關問題