2011-05-20 101 views
6

我需要查找並替換字符串中所有出現的撇號字符,但僅當此撇號後面沒有其他撇號時。正則表達式:僅匹配非重複出現的字符

也就是說

abc'def

是一個比賽,但

abc''def

不匹配。

我已經組成了一個工作模式 - (^|[^'])'($|[^'])但我相信它可能更短,更簡單。

感謝,

瓦列裏

+0

這樣? http://rubular.com/r/5oHGVS3r1c – diEcho 2011-05-20 10:03:10

+0

這是什麼環境? Perl的? JavaScript的? PHP? Java的? POSIX?並非所有正則表達式語法都是相同的。 – 2011-05-20 10:03:39

回答

2

我覺得你的模式是短而精確。你可能會使用負面的前瞻/後視,但他們會讓它變得更加複雜。可維護性很重要。

+0

你們,我已經使用正則表達式多年了,只是花了一些時間來理解昨天的lookahead和lookbehind,因爲一個stackoverflow問題。大概多說關於我而不是這個功能,但最重要的是,即使你對regexp有更多的基本知識,並且在所有環境中都是一致的,原始版本也是清晰的。 – Tao 2011-05-20 10:10:18

+0

@Tao:這就是我所說的:) – jwueller 2011-05-20 10:10:54

+0

完全同意,儘管上面的lookahead/lookbehind示例很好,簡短和正確,但我自己的原始版本更容易理解非正則表達式的精明開發人員。仍然懷疑使用哪種方法:) – ValeryC 2011-05-20 12:24:39

2

你必須要小心爲奇數撇號:

abc'''def 

,你可能要更換3次一個,離開1 ST和2 nd在那裏。

你可以這樣做(假設你已經匹配的字符串和只需要更換不均勻編號尾隨撇號):

的模式搜索:

(('')*)' 

更換
$1 

這是組1:偶數編號的撇號(或根本沒有撇號)。

我不確定你正在解決什麼樣的實際問題,但是如果你正在解析/閱讀CSV文件,或者有CSV輸入之類的字符串,我強烈推薦使用體面的CSV解析器。幾乎所有的語言都以某種形式擁有它們。

+0

不,這不是CSV。其實我正在解決一個Java類MessageFormat的問題,它吞噬單撇號字符。 – ValeryC 2011-05-20 13:06:28

0

在這裏看到的性否定lookahed​​

  • (?=pattern)是一個積極的前瞻主張
  • (?!pattern)是負先行斷言
  • (?<=pattern)是一個積極的向後看斷言
  • (?<!pattern)是負面後顧斷言

http://www.regular-expressions.info/lookaround.html

working DEMO

+0

Refernec:http://www.perlmonks.org/?node_id=518444 – diEcho 2011-05-20 10:07:51

+0

爲什麼downvoted ??? – diEcho 2011-05-20 10:29:43

+0

對不起,如果我做錯了什麼。我第一次使用了stackoverflow。 – ValeryC 2011-05-20 13:07:59