2017-03-21 34 views
1

我想在一個正則表達式通過後獲取值。樣品是在一次正則表達式通過後評估第二個正則表達式

My test string is ##[FirstVal][SecondVal]## 

我要搶FirstValSecondVal

我試過\#\#(.*?)\#\#模式,但只返回[FirstVal][SecondVal]

是否可以評估一個正則表達式的結果並應用另一個正則表達式?

+0

有解決方法,但什麼是你的正則表達式的味道?你可以很容易地在C#中用CaptureCollection,PCRE和其他一些程序來做到這一點,你可以使用'\ G'運算符來設置自定義邊界。 –

+0

@RomanPerekhrest:我想從字符串## [FirstVal] [SecondVal] ##匹配FirstVal和SecondVal。 –

+0

@WiktorStribiżew你可以用C#提供一個例子。我對C#非常熟悉。 –

回答

1

在.NET中,您可以使用捕捉棧抓住所有的重複捕獲。

一個正則表達式,如

##(?:\[([^][]*)])+## 

會發現##,然後匹配並捕獲的字符串中的任何量等[ + texts-with-no-brackets + ]並且所有這些texts-with-no-brackets將被推入一個CaptureCollection是與捕獲組相關聯1.

regex demo online

enter image description here

在C#中,你可以使用如下荷蘭國際集團代碼:

var s = "My test string is ##[FirstVal][SecondVal]##"; 
var myvalues = Regex.Matches(s, @"##(?:\[([^][]*)])+##") 
     .Cast<Match>() 
     .SelectMany(m => m.Groups[1].Captures 
      .Cast<Capture>() 
      .Select(t => t.Value)); 
Console.WriteLine(string.Join(", ", myvalues)); 

C# demo

心靈,你可以做a similar thing的Python的PyPI regex模塊

0

這會對您使用的編程語言有所不同,因爲模塊可能略有不同。我用我的解決方案使用了python,因爲你沒有指定你使用的是什麼語言,你可以在兩邊使用兩個括號#並使用轉義字符使正則表達式不匹配方括號(即\[(\w+)\] 。凡在蟒蛇重模塊\w代表a-zA-Z0-9_的外延。

import re 
data = "##[FirstVal][SecondVal]##" 
x = re.search(r'##\[(\w+)\]\[(\w+)\]', data) 
print(x.groups()) 

它打印('FirstVal', 'SecondVal')

+0

它根本不工作。它返回'## [FirstVal] [SecondVal]'作爲結果。 –

+0

我的解決方案在** Python 3.x **中工作得很好,我不知道你的正則表達式的行爲。 –