正则表达式 - 仅匹配括号的第一个实例

时间:2017-08-03 03:14:26

标签: regex grep

如下所示:http://rubular.com/r/gPpvT4ppIN我只想匹配第一对括号内的文本,即:(X11; Linux x86_64)然而它继续匹配行后面的另一对括号。我正在使用grep。

到目前为止我尝试过的正则表达式:

\(+?.+?\)

该行:

"Mozilla/4.5 (X1; Linux x86_64) AppleWebKit/534.34 (KHTML, Gecko) Qt/4.8.1 Safari/53"

目标:

(X11; Linux x86_64)

也不是

(KHTML, Gecko)

我试过使用像'。*?'这样的懒人比赛。但我不确定在哪里放。

3 个答案:

答案 0 :(得分:1)

对于python,它的内容如下:

string = "Mozilla/4.5 (X1; Linux x86_64) AppleWebKit/534.34 (KHTML, Gecko) Qt/4.8.1 Safari/53"

search = re.search(r"\((.*?)\)", string)
text = string[search.start():search.end()]

所以(。*?)匹配两者之间的所有内容,你需要把它放在两个括号之间。但是,对于括号,您需要执行“\(”和“\”)

答案 1 :(得分:1)

使用

s='Mozilla/4.5 (X1; Linux x86_64) AppleWebKit/534.34 (KHTML, Gecko) Qt/4.8.1 Safari/53'
echo $s | grep -o '([^()]*)' | head -1

输出:(X1; Linux x86_64)。请参阅online demo

<强>详情

  • grep -o '([^()]*)' - -o选项使程序返回所有匹配项(不是发生匹配的行),并搜索以下模式:
    • ( - 文字(字符(因为它是POSIX BRE模式,未转义的(与文字圆括号相匹配)
    • [^()]* - 除了()
    • 之外的0+字符的否定括号表达式
    • ) - 文字)字符
  • head -1 - 仅提取第一场比赛。

答案 2 :(得分:0)

对于Javascript:

const re = /\((.*?)\)/;
const userAgent = 'Mozilla/4.5 (X1; Linux x86_64) AppleWebKit/534.34 (KHTML, Gecko) Qt/4.8.1 Safari/53';
const platformA = userAgent.match(re)[0]; // (X1; Linux x86_64)
const platformB = userAgent.match(re)[1]; //  X1; Linux x86_64