是否可以在正則表達式中跳過捕獲組中的幾個字符?我正在使用.NET正則表達式,但這應該不重要。正則表達式跳過捕獲組中的字符
基本上,我在找的是:
[隨機文本] AB123 [隨機文本]
,我需要捕捉 'AB123',不帶連字符。
我知道AB是2或3個大寫字母,123是2或3位數字,但這並不困難。困難的部分(至少對我而言)是跳過連字符。
我想我可以分別捕獲這兩個,然後連接它們在代碼中,但我希望我有一個更優雅的,正則表達式的解決方案。
有什麼建議嗎?
是否可以在正則表達式中跳過捕獲組中的幾個字符?我正在使用.NET正則表達式,但這應該不重要。正則表達式跳過捕獲組中的字符
基本上,我在找的是:
[隨機文本] AB123 [隨機文本]
,我需要捕捉 'AB123',不帶連字符。
我知道AB是2或3個大寫字母,123是2或3位數字,但這並不困難。困難的部分(至少對我而言)是跳過連字符。
我想我可以分別捕獲這兩個,然後連接它們在代碼中,但我希望我有一個更優雅的,正則表達式的解決方案。
有什麼建議嗎?
總之:你不能。一個匹配總是連續的,即使它包含了作爲零寬度斷言的東西,如果你想要在下一個字符後面匹配下一個字符,那麼匹配是無法實現的。
您可以使用積極的lookbehead和積極的lookahead – 2015-06-01 07:26:57
真實。但是lookaround不匹配任何東西。位置正則表達式引擎在刺痛中的位置不會改變。 – Tomalak 2015-06-01 07:29:25
確實沒有辦法創建表達式,以便匹配的文本與源文本中找到的不同。你將需要由所述第一和第二部分個別地匹配並且鏈接該兩組或者刪除在一個單獨的步驟中的連字符:
match = Regex.Match(text, "([A-B]{2,3})-([0-9]{2,3})");
matchedText = string.Format("{0}{1}",
match.Groups.Item(1).Value,
match.Groups.Item(2).Value);
或通過從匹配處理在步驟除去連字符是分開的:
match = Regex.Match(text, "[A-B]{2,3}-[0-9]{2,3}");
matchedText = match.Value.Replace("-", "");
還有`match.Result(「$ 1 $ 2」)` – 2015-11-21 19:23:46
你聲稱不可能沒有分組+合併它是正確的。
你也可以像傑夫 - 希爾曼那樣做,並且在事實發生後僅僅去掉壞字符。
重要的是要注意這裏,你是「不使用正則表達式的一切」。
正則表達式針對非平凡問題的複雜解決方案而設計,您不應該對任何事情都使用「哦,我們將使用正則表達式」,並且您不應該陷入思考可以解決的問題在一步的正則表達式中的問題。
當存在一個可行的方法時,無論如何,都可以使用它。
另一個想法,如果您碰巧需要返回代碼體中的多個匹配項,請查找基於語言「回調」的正則表達式,該正則表達式允許將任何匹配/找到的組傳遞給可以執行的函數調用在線替代。 (特別適合做正則表達式替換)。
不知道它是如何工作的。淨,但在PHP你會做這樣的事情(不準確的代碼)
function strip_reverse($a)
{
$a = preg_replace("/-/", "", $a);
return reverse($a);
}
$b = preg_replace_callback("/(AB[-]?cde)/" , 'strip_reverse' , "Hello World AB-cde" ;
您可以使用嵌套的捕獲組,如下所示:
((AB)-(123))
第一個捕獲組是AB-123
,第二是AB
,第三個是123
。那麼你所要做的就是加入第二組和第三組。
有點晚了,但我想我想出了這一個。至少有一種方法可以做到這一點。
我用積極的前瞻來停止在我的文本#號。我不想要空間或#號,所以我不得不想出路去「跳過」它們。所以當我被迫再次匹配它們的時候,我把它們扔進了一個我不打算使用的垃圾組(.ie,一個桶),它在代碼中。現在,我的位置指針是超出#號的一個字符位置(我想要的位置,跳過空格和#號)。現在我只是匹配到文件名的末尾。並忽略文件擴展名。
(?i)English\\(?<Series>[^ ]+) - (?<Title>.+(?= #))(?<garb1>..)(?<Number>[^.]+)(?-i)
的文件名這是所使用的是
F:\Downloads\Downloads\500 Comics CCC CBR English\Isukani - Great Girl #01.cbr
在JavaScript中你可以:/(AB)\-(123))/.exec("[random文本] AB-123隨機文本]「);它現在返回數組[1]和[2] ^^ – hanshenrik 2015-03-26 11:01:04
如何使用積極lookahead(?=)和積極lookbehind(?<=)?基本上這個:(?<= \')([A-Z] {2} - [0-9] {3})(?= \')應該工作。 – 2015-06-01 07:26:36