2011-06-17 56 views
1

給出的以下類型的字符串:正則表達式的煩惱

「#First事##Another一個##號航天#主串#After主營###EndString」

我想拿出使用正則表達式可以將#符號包圍的所有文本作爲匹配返回。讓我感到悲傷的事情之一就是#符號既是開始分隔符又是結束分隔符。我在正則表達式中的所有嘗試都返回了整個字符串。另一個問題是部分字符串可能不被#符號包圍,如上面的子字符串「Main String」所示。有沒有人有任何想法?我已經玩弄了一些負面的回顧式斷言,但一直沒有得到它的工作。 #之間可能有或沒有空格,但我想忽略它們(不匹配它們),如果有的話。另一種選擇是隻寫一個字符串解析器例程,這很容易,但如果可能的話,我寧願使用正則表達式。

+0

你是說你想要「第一件事##另一個##沒有空間#主要字符串#A之後」作爲匹配,或者你希望每個令牌分別被#包圍? – eaolson 2011-06-17 03:01:46

+0

@eaolson:每一個作爲一個單獨的比賽 – dreyln 2011-06-17 03:15:04

+0

爲什麼不只是在#上分割,並按字段號碼抓取? – Demosthenex 2011-06-17 15:03:09

回答

1

[編輯]

我認爲這是你所需要的:

(?<=#)[^#]+?(?=#) 

隨着輸入#First Thing# #Another One##No Space# Main String #After Main#比賽:

  • First Thing
  • Another One
  • No Space
  • Main String
  • After Main

第二匹配是Thing##Another之間的空間。

[編輯]忽略空間:

(?<=)(?!\s+)[^#]+?(?=#) 

如果你想忽略尾隨空格:

(?<=)(?!\s+)[^#]+?(?=\s*#) 
+0

我相信我試過了,但我會給它一個快速檢查和報告 - 謝謝。 – dreyln 2011-06-17 02:58:53

+0

@dreyln - 忽略第一個。更新了答案。 – 2011-06-17 03:03:53

+0

嗯......不知道我剛剛嘗試過的在線正則表達式測試儀出現了什麼問題,但是第一個發佈的內容實際上並不起作用,但是您的編輯非常接近 - 我想我可以玩弄它 – dreyln 2011-06-17 03:11:40

1

試試這個。第一組和最後一組不應該被捕獲,並且。*?應該

(?:#)(.*?)(?:#) 

我想這是你真正需要的:

((#[^#]+#)|([^#]*[^#\s]+[^#]*)) 

,但它不會捕捉周圍Main String

+0

感謝NullRef,您的解決方案完美無缺! – dreyln 2011-06-17 03:14:14

+0

甜!任何時候。 @dreyln – NullRef 2011-06-17 03:16:09

+0

嗯......這個表達式與示例中的「主要字符串」不匹配,對吧? – 2011-06-17 03:16:36

2
/((#[^#]+#)|([^#]+))/ 

也許有點像的#的上面會匹配你想要的。

這將匹配兩個哈希之間的空間。嗯。

/((#[^#]+#)|([^#]*[^#\s]+[^#]*))/ 

這會擺脫討厭的空間,我認爲。

+0

它很接近 - 我仍然通過第二個正則表達式與第二個正則表達式匹配0123雖然 – dreyln 2011-06-17 03:20:59

+1

+1如果使用'\ s'而不是' \ S'。 – NullRef 2011-06-17 04:02:56

+0

@NullRef-是的。我可能最終會使用這一個,因爲(儘管我沒有在問題中明確說明),通過使#s圍繞擁有它們的匹配區分#s和主要字符串之間的字符串是很好的。如果可以的話,我會給你們所有三個人的答案。謝謝。 – dreyln 2011-06-17 04:17:00