2013-08-17 50 views
0

所以,我對於正則表達式相當陌生。話雖如此,我正在尋求幫助。我有這個正則表達式來做我想做的事情,但這很簡單,因爲我可以用我目前的理解來做到這一點。簡化我的Eclipse正則表達式

(\w+\s*?\w+\s*?\-*?/*?\w+)\s*?(\(\w+\))

什麼這個需要匹配的字符串以下配置:

word 
word word 
word-word 
word/word 
word word/word 
word word/LL 
word word (word) 
word-word word/word 

我有種感覺我濫用*?但我看到的是使用的一個例子,它似乎做我所需要的。我也看到只有*會做同樣的事情嗎?或者只是??無論如何它是。提前致謝!

此外,分組是在那裏,因爲這個正則表達式實際上與其他組顯着更長。請記住這一點。我需要該團隊仍然與其他人共同工作(共4人)。

編輯:對不起大家。實際上,我試圖使用Eclipse IDE中的內置查找/替換(使用正則表達式)將正在從PDF複製的文本轉換爲Python語法。這就是爲什麼我沒有指定我使用的是什麼。我認爲這只是普通的正則表達式。

此外,我目前的正則表達式完美。我在這裏要求的是關於簡單性的一課(並且更好地解釋了*?)。我只覺得我現在的正則表達式很長很醜。

+4

可以有微妙的不同語言的正則表達式的語法和功能之間的差異。我們在這裏談論哪一個? – Edward

+4

請同時指定您*不希望匹配的字符串。 '。*'是最簡單的模式,可以與您指定的所有人匹配,但我認爲您不需要這樣。 –

+2

是的,並且也用英文描述了你想要匹配的內容。 –

回答

2

?其他RegEx量詞使他們不情願。這意味着只有當RegEx的其餘部分無法匹配時,它們纔會匹配輸入。

當應用的字符集與下面的集沒有共同的字符時,不願意的?是多餘的。例如在:

[0-9]*?[A-Z] 

沒有辦法[A-Z]會匹配,除非所有以前[0-9]■找得到匹配。那爲什麼讓[0-9]*不情願?相反,通過刪除?來使它變得貪婪。

[0-9]*[A-Z] 

還有第二種情況,?被濫用。例如,你知道某些文本包含一個冒號,例如一個大寫字母。沒有其他可能發生的冒號。

.*?:[A-Z]+ 

會做這項工作。 Hoevever,

[^:]*:[A-Z]+ 

代表更好的事實,冒號總是會啓動你想匹配的事實。在這種情況下,我們通過意識到事實上並不需要一個「創造」第一個條件(性格共性)。 IOW我們從來不需要.*匹配: s,但只需[^:]*

我不願意使用不情願的操作符,因爲它有時會模糊模式而不是澄清它們,也是因爲性能影響,這都要歸功於它極大地增加了回溯級別(而沒有理由)。

應用這些原則,

(\w+\s*\w+\s*\-*/*\w+)\s*(\(\w+\)) 

似乎是一個更好的選擇。此外,在某些時候您使用\-*/*。如果沒有像(正面)例子那樣多的反例(在開發和測試任何正則表達式時這是非常重要的),你很難知道你真正想要什麼,但是你真的想要接受許多- s,接下來可能還有許多/ S'我的印象是,你正在尋找的是一個-或一個/或一個空間。 [ \-/]會做得更好。或許\s*[\-/]?\s*,如果你想接受多個空格,甚至在和/或[\-/]

(\w+\s*\w+\s*[\-/]?\s*\w+)\s*(\(\w+\)) 

後見正則表達式的the Java documentation以瞭解更多信息。

+0

Eclipse IDE提供查找/替換正則表達式的建議。 '*?'被具體列爲「匹配0或1個實例」。這是我使用'*?'的原因(並且它工作,啓動)。也許它與正常不同? – jtsmith1287

+0

這是在字符集之後立即使用的情況。在量詞('*','+'或其他'?')之後使用時,它會使人不情願。 Eclipse使用Java RegExe,因此我將向答案中添加一個指向Java文檔的指針。 –

0

p.s.w.g指出(。*)是我所需要的最簡單的形式是正確的。我的正則表達式的另外3個分組足夠具體,以至於它可以工作。謝謝p.s.w.g.

PS仍然不知道我爲什麼下投票

+0

可能是因爲你的問題似乎太基本了。我不同意。或者至少在這個標準上下調。這促使我在Meta中發佈了一些東西。 http://meta.stackexchange.com/a/193723/231202 –