2016-06-28 26 views
0

我試圖用正則表達式在我的開始/結束字符(「<」「>」)中獲取文本,而忽略文本內部的加倍結束字符(so 「< <」應包含在捕獲的數據中)。在開始/結束字符內部捕獲文本,但忽略加倍結束字符

我試圖

<([^>]*)> 

<(.*?)>(?!>) 

但我目前在以下情況下失敗:

輸入:

<test>>Value> 

預期輸出:

test>>Value 

但我的正則表達式只捕獲部分字符串。

第一個捕獲

test 

和第二

test> 

可悲的是我出的想法就如何進一步處理這個問題。 你們其中的一位正則表達者的神有什麼想法如何解決這個問題?

編輯:

感謝您的答案,遺憾的是不匹配的另一個要求我有(其中我放棄了繼續的問題儘可能短想着它wouldnt重要...教訓教訓)

輸入:

<test>>Value><test> 

預期輸出:

test>>Value 
test 
+0

你給的第一個例子有什麼問題......它似乎對我有用。 –

+0

@RickRunowski啊我忘了這個輸出「test」而不是「test>」。它仍然是錯誤的,但我會澄清這個問題。 – Sosian

回答

2

使用zero-width negative lookahead assertion以匹配>沒有跟着另一個>終止比賽似乎最簡單的方法:

<(.*)>(?!>) 

時對<test>>more>匹配捕捉test>>more

注意,你的第二個正則表達式(<(.*?)>(?!>))使用最少的配套修改,所以將在第一>沒有再接再>停止。

編輯

隨着更多的信息,所以<test>>more><another>應該捕獲test>>moreanother:使用Regex.Matches

<([^>]*(?:>>[^>]*)*)> 

將使上述捕獲。

擴展

<  # Match < 
(  # Start capture 
    [^>]* # Match many non-> 
    (?: # Start non-capturing group 
    >> # Match >> 
    [^>]* # Match many non-> 
)*  # Repeat zero or more 
)  # End capture 
>  # Match > 

IE瀏覽器。它將尖括號內容分解成>>和非>塊,並匹配它們的數目不確定。它將處理<>>>(捕獲>>)。

+0

這比我的選擇更好:'<((.*[>] {2,}。*)| [^>] *)>' –

+1

這匹配'>更多>或甚至更多>我猜這是錯誤的。請參閱[regex101](https://regex101.com/r/gL1jX2/1)。 – ClasG

+0

感謝您的回答和解釋,我真的想知道爲什麼第二個沒有工作。您的答案與原始問題相符,但不適用於我爲了一個簡短的問題而忽略的另一個要求。謝謝你的幫助! – Sosian

-1
(\w+)>{1,2}(\w+) 

或者試試這個,不<在開始和>底。

+1

我在猜測,但我很確定它仍然應該匹配'' – ClasG

+0

正確的猜測ClasG,澄清了問題。 – Sosian

+0

有人可以解釋我,爲什麼在這個表達式中<(.*)>(?!>)之前有什麼問題!和>呢? –

2

這是我去的吧:)

<((?:>>|[^>])*)> 

它首先通過開<匹配,然後嘗試匹配>>,如果不匹配,除>以外的任何字符,重複,直到結尾>被發現,

它也可以與添加的要求;)

Check it out here at regex101

+0

這很好,我也玩過這個變種:['<((?> >> | [^>] +)*)>'](https ://regex101.com/r/wZ3uF8/1) –

相關問題