正则表达式:精确匹配一次

3

我需要一个正则表达式,匹配恰好出现一次花括号对:

myString_{1-10}         -> match
myString_{hello}_xyz    -> match
myString_{1-10}_{hello} -> do not match

这是我的正则表达式:

(\{)[^}]*(\})

问题在于我的正则表达式也匹配包含多个花括号对的字符串…我错过了什么?

未匹配的大括号如何处理?例如,myString_}{}myString_{}_{ - SheetJS
你是对整段文字进行正则表达式匹配还是逐行匹配? - Michael Mikhjian
3个回答

3
您可以使用以下内容:
^[^{}]*\{[^}]*\}[^{}]*$

说明:

^[^{}]*    // Match 0 or more occurrences of character other than [{}]
 \{        // Match a `{`
 [^}]*     // Match 0 or more occurrences of character other than }
 \}        // Match a `}`
 [^{}]*$   // Match 0 or more occurrences of character other than [{}]

你需要注意嵌套的括号或未匹配的括号


如果我只想要花括号之间的内容怎么办?我尝试了这个^ [^ {}] *(?<= \ {)[^}] *(?= \})[^ {}] * $,但它不起作用。 - j3d
只需将上面正则表达式中 {} 之间的内容移动到捕获组中即可。你正在使用先行断言,这就是为什么它失败的原因。使用 ^[^{}]*\{([^}]*)\}[^{}]*$,并获取捕获组 1 - Rohit Jain
我需要两个不同的正则表达式...一个只返回花括号之间的内容(mystring{1-10} => 1-10),另一个返回内容和花括号(mystring{1-10} => {1-10})。你明白我的意思吗? - j3d
你可以添加另一个捕获组 - ^[^{}]*(\{([^}]*)\})[^{}]*$。现在,第1组包含花括号,第2组包含不带花括号的内容。 - Rohit Jain

0
你可以在 .net 中使用多行模式来使用这个模式:
(?<=^(?>[^{\n]*))\{[^}]*\}(?=[^{\n]*$)

0
如果你正在使用正则表达式来匹配包含三行的整个变量,那么这就是你要找的内容:
(\{.*?\})_*(?:\{)*

输出将包含您要查找的内容。

这需要使用“s”标志 // 点匹配所有。


下划线只是一个例子...任何字符都是可能的。 - j3d

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接