2010-07-21 36 views
9

我有遍歷字符串,並拿出40個值的正則表達式,它看起來有點如果像下面的查詢,但更大,更復雜的正則表達式表達回來引用超過9個值替換

est(.*)/test>test>(.*)<test><test>(.*)test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test> 

我的問題是,當數字超過9時,如何使用這些表達式與replace命令。看起來好像每當使用\10時,都會返回\1的值,然後在末尾附加0

任何幫助,將不勝感激謝謝:)

而且我使用UEStudio的,但如果不同的程序做的更好,然後根本不算:)

+5

在Sublime Text中,「\ 10」也不起作用,但「$ 10」可以工作。 – 2012-12-07 04:32:35

回答

3

最簡單的正則表達式引擎的使用編輯沒有能力處理超過10個配對組;它看起來不像UltraEdit可以。我只是嘗試記事本++,它甚至不會匹配 10個正則表達式。

我認爲最好的辦法是用快速的語言寫一些快速的東西,用正常的正則表達式解析器。 但不會回答這個問題是問

這裏的東西在Python:

import re 

pattern = re.compile('(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)') 
with open('input.txt', 'r') as f: 
    for line in f: 
     m = pattern.match(line) 
     print m.groups() 

需要注意的是Python允許反向引用如\20:爲了有一個逆向引用後面文字組2 0,您需要使用\g<2>0,這是明確的。

編輯: 大多數正則表達式的口味,和編輯,其中包括一個正則表達式引擎,應遵循替代語法如下:

abcdefghijklmnop 
search: (.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(?<name>.)(.) 
note: 1 2 3 4 5 6 7 8 9 10 11 12 13 
value: a b c d e f g h i j k l m 
replace result: 
    \11  k1  i.e.: match 1, then the character "1" 
    ${12} l  most should support this 
    ${name} l  few support named references, but use them where you can. 

命名引用通常只可能在正則表達式庫的非常具體的味道,測試你的工具肯定知道。

+2

「有些人在遇到問題時會想:」我知道,我會用正則表達式。「現在他們有兩個問題。」 - 傑米Zawinski 以上報價似乎從未如此真實:( 感謝您的幫助:) – 2010-07-22 14:26:12

1

如果你不能處理超過9個子組,爲什麼不最初匹配9個組,然後循環並對這些匹配應用正則表達式?

即第一匹配(<test.*/test>)+然後對於每個子組匹配<test(.*)/test>

+0

不幸的是在我的情況下,這將無法正常工作,模式是相當大的。不過,我很欣賞這個建議。謝謝:) – 2010-07-22 14:27:01

9

正如psycho brm指出的那樣: 使用$ 10而不是\ 10 我使用的是記事本++,它的工作效果非常美觀。

1

嘗試使用命名組;所以不是第十:

(.*) 

使用:

(?<group10>.*) 

,然後使用以下替換字符串:

${group10} 

(在沒有使用循環一個更好的解決方案是當然的,並記住根據您的環境,可能會有不同的正則表達式語法風格。)

+0

在nginx中使用正則表達式匹配時,這對我有效,它似乎不喜歡匹配超過9個組。 OP有同樣的問題,其中10美元被解釋爲1美元+0美元。 – theChumpus 2016-08-19 10:33:21

0

在雙數字小組的前面放置$:例如, \ 1 \ 2 \ 3 \ 4 \ 5 \ 6 \ 7 \ 8 \ 9 $ 10它爲我工作。