2013-03-08 76 views
3

這與一些有關:Regular Expression - Formatting text in a block - IM但有一個不同的問題。正則表達式查詢幫助 - Lookbehind

尋找-的文字換行符合下列條件:

條件:

  • 令牌可以在啓動或行尾
  • 令牌必須由空格或一個或多個被包圍符號:{。,!@#$ ....}。
    • 一定不能是包含-對的正常字符[a-zA-Z]。
    • 看樣測試3 ... W-感謝你 -
    • 測試4和5成功,因爲-是包裹着[^ A-ZA-Z]
  • 令牌不能跟一個在第一-或空間之前的最後-
    • 的空間「-Wow - 」將不會是一個匹配作爲閉合-用空間之前。
    • 見樣本測試6和7

對於正則表達式的前我需要:(^|[\s\W]+)
和端將是:($|[\s\W]+)

我有當前的表達,但由於逃生條件在找到第一個後停止,故障是失敗的-

(^|[\s\W]+)-([^\s][^-]*)-($|[\s\W]+) 

樣品測試字符串是:

  1. (全部):-Wow-thank you-.
  2. (WOW):-Wow- thank you-!
  3. (NIL):- Wow-thank you-.
  4. (謝謝):- Wow!-thank you-
  5. (感謝你):- Wow -thank you-
  6. (全部):-Wow - thank you-
  7. (N IL):-Wow - thank you -

這是否需要看後面? (我是一個正則表達式的新手,所以請忍受我)或者是我的中間狀況完全錯誤。

謝謝你!
mwolfe。

+0

我不明白你的第一條評論後你的第二個條件。 – 2013-03-08 06:52:47

+1

由於在「-thank you-」之前有一個字符「w」,因此示例3失敗。如果該字符是空格或符號,那麼「感謝您 - 」將被識別/標記/找到。這就是爲什麼Example 4工作的原因,因爲「 - 」之前的字符是「!」 – 2013-03-08 06:56:31

+1

+1 - 非常好的嘗試,特別是對於(自稱)新手。 – 2013-03-08 07:16:14

回答

1

嘗試一個更簡單的中間表達式。

(^|[\s\W]+)-(.*?)-($|[\s\W]+) 
      ^^^ 

非貪婪通配符匹配將捕獲所需的最小字符串匹配以下-($|[\s\W]+)


編輯。好吧,我明白爲什麼這是錯的。你希望一個非空格字符能夠立即跟隨並分別成功打開和關閉破折號。所以試試這個:

(^|[\s\W]+)-(\S.*?\S)-($|[\s\W]+) 
      ^^ ^^ 
+1

方式更好。但它沒有捕獲測試#6 – 2013-03-08 07:18:09

+1

你確定?適用於我:http://rubular.com/r/xhXidunhmF。除非我誤解你的例子。 (^ | [\ s \ W] +) - [^ \ s](。*?)[^ \ s] - ($ | [\ s \ W] +) – 2013-03-08 07:20:41

+1

) !你在rubular上的鏈接在你的第一篇文章中更加先進。感謝您的光彩;一直在使用regex101.com – 2013-03-08 07:20:48