2015-12-15 46 views
-1

我有一個正則表達式捕獲,我想從捕獲的字符串的中間中排除一個字符(在這種情況下是一個空格)。這可以通過修改正則表達式在一個步驟中完成嗎?如何從正則表達式捕獲組中排除一個字符?

(快速和骯髒的)例子:

Text: Key name = value 
My regex: (.*) = (.*) 
Output: \1 = "Key name" and \2 = "value" 
Desired output: \1 = "Keyname" and \2 = "value" 

更新:我不知道正則表達式引擎將運行這個表達式,因爲它是一個大型軟件產品的一部分。如果您有解決方案,請指定它將運行在哪個引擎上,哪個引擎不運行。

Update2:上述產品將正則表達式作爲輸入,然後再使用匹配的值,這就是要求提供一步解決方案的原因。沒有機會在管道中插入中間處理步驟。

+0

比賽結束後你難道不能替換嗎? –

+1

什麼是語言?在不知道正則表達式將被使用的編程語言的情況下,很難提供適當的幫助。正如[regex標籤信息](http://stackoverflow.com/tags/regex/info)所述,帶有該標籤的所有問題也應該包括指定適用的編程語言或工具的標籤。 –

+0

@stribizhev,完整的解決方案可能取決於語言,但問題的答案不會。在任何正則表達式中,你都不能在單個正則表達式匹配中做到這一點。你必須匹配整個事情,然後刪除空格。 –

回答

-1

我會拿出某物。如:

(?<key>[\w]+)\s*=\s*(?<value>.+) 
# look for a word character and capture it in a group called "key" 
# followed by zero or unlimited times of a whitespace character (\s) 
# followed by an equation sign 
# followed by zero or unlimited times of a whitespace character (\s) 
# capture the rest in a group called value 

...然後處理捕獲的輸出。但與\w字符類沒有空格匹配(你有鑰匙與空白在裏面?)。
查看working demo here。但正如評論中提到的那樣,這取決於你的編程語言。

0

這是使用結束以前匹配\G錨一個可能的理論純的正則表達式實現:

/(?:\G(\w+)\h(?:(?:=\h)(\w+))?)+/g 

Online demo

勒亙

(?:   # Non capturing group 1 
    \G   # Matches where the regex engine stops in the previous step 
    (\w+)  # capture group 1: a regex word of 1+ chars 
    \h*   # zero or more horizontal spaces (space, tabs) 
    (?:   # Non capturing group 2 
    =\h*  # literal '=' follower by zero or more hspaces 
    (\w+)  # capture group 2: a regex word of 1+ chars 
)?   # make the non capturing group 2 optional 
)+   # repeat the non capturing group 1, one or more 

在替代演示部分:

  • \1實際上包含Keyname(2項由假空格隔開)
  • \2value

:除非確實需要,我不建議使用這種(爲什麼?)。

在兩個步驟中有多種可能的方法:確實已經說明從OP正則表達式的第一個捕獲組中簡單地刪除空格。

+0

問題清楚地陳述需要一步式解決方案,您是否有任何特殊原因說您不推薦您的解決方案? –

+0

您的解決方案不會產生預期結果,而且我也不理解它足以自己修改它。你能編輯它(如果可能的話)以滿足問題的要求嗎? –

+0

@DanNestor:解釋我爲什麼需要一步式解決方案,我發現有趣的是試圖解決您的問題,但我認爲,通過詳細的解釋,您的問題將得到更好的接收。無論如何''\ G''在某些正則表達式引擎中不可用。因爲我知道沒有''\ G''不可能滿足你所​​有的約束。 –

相關問題