2014-10-30 60 views
2

另一個x或\逃脫.NET,我需要通過自身也不由\比賽的X未在.NET

PCRE分割使用的沒有逃脫字符x一個字符串,我可以匹配特定的X使用正則表達式的動詞,例如:[x\\]x(*SKIP)(*FAIL)|x - DEMO

但我不能想出一個辦法做到這一點在.NET

下面是一些爲例ES:

ie: in xxx => match the last x 
    in axa => match the one x 
    in xx => match NONE 
    in xxxx => match NONE 
    in xx\x => match NONE 
    in xxx\x => match the 3rd x only 
    in \xxx => match NONE 
    Xs can be from 1 to 100 :-/ 

編輯1: BTW,here's the RegEx quick reference for .NET

編輯2:

正如我所說的,我想串的分裂 「非逃X」 ...換句話說,我想捕獲由該x分隔的字符串部分。例如:

aaaxxxbbbxcccxdddxxeee => I should capture: aaaxx 
    ^^^        bbb 
    SPLIT HERE        ccc 
              dddxxeee 

編輯3:

我終於做出這樣的:((?:(?:[^x\\]|\\[^x])+(?:[x\\]x)*|(?:[x\\]x)+)+) - DEMO

難道是優化嗎?如果是的話,將它張貼作爲一個答案,我會接受它(如果它確實增加了一些)

編輯4: 解決了,感謝Tim Pietzcker

+0

如果一個人做一個正則表達式替換有,我會提供一個選項對.Net來說是獨一無二的。建議我需要知道XXX被更改爲什麼,例如XXY和其他組合。你能提供超出比賽條件的結果嗎? – OmegaMan 2014-10-30 15:48:16

+0

@OmegaMan,檢查我的最後編輯 – Enissay 2014-10-30 16:19:41

回答

4

有一個更簡單的方法。不要使用Split(),使用Matches()

Regex regexObj = new Regex(@"(?>[^\\x]+|[\\x]x)+"); 
allMatchResults = regexObj.Matches(subjectString); 

測試它live on regex101.com

說明:

(?>  # Start an atomic group (to avoid backtracking) 
[^\\x]+ # Either match any number of characters except backslashes or x 
|   # or 
[\\x]x # match \x or xx 
)+  # Repeat as necessary 

在情況下可能還會有其他的反斜槓除了\x,使用

Regex regexObj = new Regex(@"(?>[^\\x]+|xx|\\.)+"); 
+0

令人驚歎的是,這是簡單的xD非常感謝:) – Enissay 2014-10-30 23:09:43

+0

不客氣。創建一個匹配你真正想要的匹配之間的東西的正則表達式通常更容易 - 所以總是值得一提的是,拆分或匹配是否更簡單。 – 2014-10-30 23:14:10

+0

令人印象深刻,我建議將模式修改爲'((?> [^ \\ x] + | [\\ x] x | \\(?! x))+)'所以不要忽略'\' by'x' http://regex101.com/r/xC3nG9/4 – 2014-10-31 01:19:18

0

使用這種模式,結果保存在子模式#1

(?:\\x|xx)|(x) 

Demo

OK,這可以在兩個步驟來完成:
步驟1:使用這種模式(\G.*?[^x\\](?:\\x|xx)*)x(?!x)瓦特/ gms選項
和替換瓦特/類似$1<SPLIT HERE>
步驟2:在此模式執行分裂<SPLIT HERE>
Demo1

或選項#2:
使用此圖案(\G.*?[^x\\](?:\\x|xx)*)x(?!x)|(.*) w/gm選項
並檢查子圖案1 Demo2

+0

正如我在我的問題中所說的,匹配的x將用於分割函數(如php中的preg_split)...所以使用捕獲/非捕獲組不會改變任何東西在這種情況下 – Enissay 2014-10-30 15:20:34

+0

更新了我的回答 – 2014-10-30 20:34:15

+0

以上兩個步驟似乎是一個矯枉過正的過程......請檢查我的第三個編輯,並感謝您的興趣很多<3 – Enissay 2014-10-30 21:00:50