2010-10-26 66 views
19

請仔細閱讀:這有點不尋常,你會試圖說這樣的事情,「這不是如何使用正則表達式」或「夥計,只是使用String.SubString (),「等...正則表達式來獲取文本BETWEEN兩個字符

我有一個需要編寫一個正則表達式(使用預先存在的方法),將匹配文本之間的大括號花括號,但不是大括號本身。

例如: 「{} MatchThisText」 「啦啦啦{} MatchThisText啦啦啦......」
都應該匹配: 「MatchThisText」

Someone asked this exact question a year ago,他除了「MatchThisText」之外,還有一些正則表達式匹配大括號,導致匹配「{MatchThisText}」,這不是他(或我)需要的。

如果有人可以寫一個實際上只匹配大括號之間的字符的正則表達式,我真的很感激它。它應該允許任何ASCII值,並且應該停止在FIRST右括號處的匹配。

例如: 「{retailCategoryUrl}/{濾波器}」
應該匹配: retailCategoryUrl和過濾器
但是不匹配: 「retailCategoryUrl}/{過濾器」(一切,但外括號)

嘿,這對我來說真的很棘手,所以請原諒這個問題,如果這對你們中的一些人來說是微不足道的。

謝謝!

+0

很容易(需要分組,但說實話,這是一個非常基本的功能), (例如完整的解析器所做的),在這種情況下,它根本不可能(除非使用那些非正則表達式擴展的某些實現,例如NET)。 – delnan 2010-10-26 18:21:05

+0

我們需要更多的上下文,因爲解決方案可能會涉及後視和前瞻運算符,所以取決於您使用的正則表達式的方言。 – 2010-10-26 18:24:05

+0

'{(\ w +)}' - 括號表示一個組,您可以獲取其中的內容。 – 2010-10-26 18:25:32

回答

17

的Python:

(?<={)[^}]*(?=}) 

在背景:

#!/usr/bin/env python 

import re 

def f(regexStr,target): 
    mo = re.search(regexStr,target) 
    if not mo: 
     print "NO MATCH" 
    else: 
     print "MATCH:",mo.group() 

f(r"(?<={)[^}]*(?=})","{MatchThisText}") 
f(r"(?<={)[^}]*(?=})","La la la {MatchThisText} la la la...") 

打印:

MATCH: MatchThisText 
MATCH: MatchThisText 
+1

注意到有時你需要使用類似於'(?<= \ {} [^ \}] *(?= \})的'{'應用程序會試圖將大括號視爲重複操作符的代表。 – andi 2015-03-05 12:45:27

8

你需要一個非貪婪匹配運算,*?,停止比賽只要發動機看到一個閉合的捲曲支架。然後,您需要使用圓括號將括號內的內容分組。這應做到:

{(.*?)} 

然後,您將需要你的正則表達式API從group 1號獲得的價值。 (你如何做到這一點取決於你的編程語言/ API)

+0

非常有幫助,謝謝! – mdegges 2017-11-29 07:22:03

12

如果您使用的是與先行和像Python回顧後支持正則表達式引擎,那麼你可以使用

/(?<={)[^}]*(?=})/

如果它不(比如javascript),你可以使用/{([^}]*)}/並獲得子字符串匹配。JavaScript示例:

"{foo}".match(/{([^}]*)}/)[1] // => 'foo'

0

current answer作品與.NET正則表達式,但需要從所有比賽中刪除花括號:

var regex = new Regex(@"(?<={)[^}]*(?=})", RegexOptions.Compiled); 
var results = regex.Matches(source) 
        .Cast<Match>() 
        .Select(m => m.Value.TrimStart('{').TrimEnd('}')); 
0

在Javascript中你得到所有匹配的數組。這裏是machtes css`和'之間的文本machting模板字符串的例子:除非你要考慮嵌套括號「正確」

yourstring.match(/css`([^}]+).`/gmi)