我需要查找並替換字符串中所有出現的撇號字符,但僅當此撇號後面沒有其他撇號時。正則表達式:僅匹配非重複出現的字符
也就是說
abc'def
是一個比賽,但
abc''def
不匹配。
我已經組成了一個工作模式 - (^|[^'])'($|[^'])
但我相信它可能更短,更簡單。
感謝,
瓦列裏
我需要查找並替換字符串中所有出現的撇號字符,但僅當此撇號後面沒有其他撇號時。正則表達式:僅匹配非重複出現的字符
也就是說
abc'def
是一個比賽,但
abc''def
不匹配。
我已經組成了一個工作模式 - (^|[^'])'($|[^'])
但我相信它可能更短,更簡單。
感謝,
瓦列裏
取決於您的環境 - 如果你的環境支持先行和回顧後,你可以這樣做:(?<!')'(?!')
我覺得你的模式是短而精確。你可能會使用負面的前瞻/後視,但他們會讓它變得更加複雜。可維護性很重要。
你們,我已經使用正則表達式多年了,只是花了一些時間來理解昨天的lookahead和lookbehind,因爲一個stackoverflow問題。大概多說關於我而不是這個功能,但最重要的是,即使你對regexp有更多的基本知識,並且在所有環境中都是一致的,原始版本也是清晰的。 – Tao 2011-05-20 10:10:18
@Tao:這就是我所說的:) – jwueller 2011-05-20 10:10:54
完全同意,儘管上面的lookahead/lookbehind示例很好,簡短和正確,但我自己的原始版本更容易理解非正則表達式的精明開發人員。仍然懷疑使用哪種方法:) – ValeryC 2011-05-20 12:24:39
你必須要小心爲奇數撇號:
abc'''def
,你可能做要更換3次一個,離開1 ST和2 nd在那裏。
你可以這樣做(假設你已經匹配的字符串和只需要更換不均勻編號尾隨撇號):
的模式搜索:
(('')*)'
與
更換$1
這是組1:偶數編號的撇號(或根本沒有撇號)。
我不確定你正在解決什麼樣的實際問題,但是如果你正在解析/閱讀CSV文件,或者有CSV輸入之類的字符串,我強烈推薦使用體面的CSV解析器。幾乎所有的語言都以某種形式擁有它們。
不,這不是CSV。其實我正在解決一個Java類MessageFormat的問題,它吞噬單撇號字符。 – ValeryC 2011-05-20 13:06:28
在這裏看到的性否定lookahed
(?=pattern)
是一個積極的前瞻主張(?!pattern)
是負先行斷言(?<=pattern)
是一個積極的向後看斷言(?<!pattern)
是負面後顧斷言
這樣? http://rubular.com/r/5oHGVS3r1c – diEcho 2011-05-20 10:03:10
這是什麼環境? Perl的? JavaScript的? PHP? Java的? POSIX?並非所有正則表達式語法都是相同的。 – 2011-05-20 10:03:39