我确定这是重复的,但找不到正确的搜索条件。
基本上我有一个用户提供的字符串,其关键字括在大括号中,我想要一个可以找到关键字但会忽略双组分隔符的正则表达式。
例如:“{{hat}} 中的猫不会咬 {back}。”
我需要返回 {back} 但不返回 {hat} 的正则表达式。
这是针对 C# 的。
这就是你要找的
(?<!\{)\{\w+\}(?!\})
试试这个,这将要求左括号和右括号是单一的。双括号将被忽略。
另请参阅此永久链接示例
[^{][{]([^}]*)[}][^}]
using System;
using System.Text.RegularExpressions;
namespace myapp
{
class Class1
{
static void Main(string[] args)
{
String sourcestring = "A cat in a {{hat}} doesn't bite {back}.";
Regex re = new Regex(@"[^{][{]([^}]*)[}][^}]");
MatchCollection mc = re.Matches(sourcestring);
int mIdx=0;
foreach (Match m in mc)
{
for (int gIdx = 0; gIdx < m.Groups.Count; gIdx++)
{
Console.WriteLine("[{0}][{1}] = {2}", mIdx, re.GetGroupNames()[gIdx], m.Groups[gIdx].Value);
}
mIdx++;
}
}
}
}
$matches Array:
(
[0] => Array
(
[0] => {back}.
)
[1] => Array
(
[0] => back
)
)
答案会因您使用的正则表达式解析器而略有不同,但您可能想要如下内容:
(?:[^{]){([^}]*)}|{([^}]*)}(?:[^}])|^{([^}]*)}$
非“{”(不是匹配的一部分)后跟“{”(捕获)所有非“}”字符(结束捕获)后跟“}”,或者...
“{”后跟“{”(捕获)所有非“}”字符(结束捕获)后跟非“}”(不是匹配的一部分),或者...
行首后跟“{”(捕获)所有非“}”字符(结束捕获)后跟行尾
请注意,某些解析器可能无法识别“?:”运算符,并且某些解析器可能要求对以下部分或全部字符(当不在“[]”内时)进行反斜杠转义: { } ( ) |
不太难,只是使用了 Regex 助手:
(?:[^{]){([^}]*)}|{([^}]*)}(?:[^}])|^{([^}]*)}$