用于验证文本中的宏的正则表达式
Regex to validate macros in text
我正在尝试构建一个正则表达式来验证可以包含以下格式的宏的文本:
Some text (*MacroIDInsert*) some text continues..
我想检测宏不存在的情况
- 正确关闭(例如“(*”而不关闭“*)”)
- 正确打开(例如“*)”而不打开“(*”)
我想检测的无效案例示例:
Some text (* Invalid Macro Insert some text (*ValidMacroInsert*)
或
Some text Invalid Macro Insert *) some text (*ValidMacroInsert*)
我想匹配缺少括号的 (* 或 *)。并可能相应地将 "bad" 替换为 < 和 >,例如:
Some text Invalid Macro Insert > some text (*ValidMacroInsert*)
使用正则表达式可以实现吗?
更新:
进一步的说明显示文本可能包含 嵌套 宏,例如:
Some text (*MacroID1(*MacroID2*)*) some text continues..
在这种情况下,我的理解是无法判断"invalid"中的哪个括号被替换...
例如,考虑以下结构:
(*id1*) (*id2*) (* (*id3*) (* id5 (*id4*) *)
^^? ^^?
在这种情况下,我们不知道(上面)标记的两个括号中的哪一个是不正确的...
如果你的语言支持 PCRE
动词,(*SKIP)(*F)
,我确实使用了。
\(\*(?:(?!\(\*|\*\)).)*\*\)(*SKIP)(*F)|(?:\(\*|\*\))
即使用此 \(\*(?:(?!\(\*|\*\)).)*\*\)(*SKIP)(*F)|\(\*
正则表达式,然后将匹配的字符替换为 <
然后将此正则表达式 \(\*(?:(?!\(\*|\*\)).)*\*\)(*SKIP)(*F)|\*\)
用于修改后的字符串并将匹配的字符替换为 >
我喜欢 C#
中的可变长度回顾功能
string str = @"Some text (* Invalid Macro Insert some text (*ValidMacroInsert*)
Some text Invalid Macro Insert *) some text (*ValidMacroInsert*)";
string result1 = Regex.Replace(str, @"(?m)\(\*(?=(?:(?!\(\*|\*\)).)*\(|$)", "<");
string result2 = Regex.Replace(result1, @"(?<!\(\*(?:(?!\(\*|\*\)).)*)\*\)", ">");
Console.WriteLine(result2);
我正在尝试构建一个正则表达式来验证可以包含以下格式的宏的文本:
Some text (*MacroIDInsert*) some text continues..
我想检测宏不存在的情况
- 正确关闭(例如“(*”而不关闭“*)”)
- 正确打开(例如“*)”而不打开“(*”)
我想检测的无效案例示例:
Some text (* Invalid Macro Insert some text (*ValidMacroInsert*)
或
Some text Invalid Macro Insert *) some text (*ValidMacroInsert*)
我想匹配缺少括号的 (* 或 *)。并可能相应地将 "bad" 替换为 < 和 >,例如:
Some text Invalid Macro Insert > some text (*ValidMacroInsert*)
使用正则表达式可以实现吗?
更新: 进一步的说明显示文本可能包含 嵌套 宏,例如:
Some text (*MacroID1(*MacroID2*)*) some text continues..
在这种情况下,我的理解是无法判断"invalid"中的哪个括号被替换... 例如,考虑以下结构:
(*id1*) (*id2*) (* (*id3*) (* id5 (*id4*) *)
^^? ^^?
在这种情况下,我们不知道(上面)标记的两个括号中的哪一个是不正确的...
如果你的语言支持 PCRE
动词,(*SKIP)(*F)
,我确实使用了。
\(\*(?:(?!\(\*|\*\)).)*\*\)(*SKIP)(*F)|(?:\(\*|\*\))
即使用此 \(\*(?:(?!\(\*|\*\)).)*\*\)(*SKIP)(*F)|\(\*
正则表达式,然后将匹配的字符替换为 <
然后将此正则表达式 \(\*(?:(?!\(\*|\*\)).)*\*\)(*SKIP)(*F)|\*\)
用于修改后的字符串并将匹配的字符替换为 >
我喜欢 C#
string str = @"Some text (* Invalid Macro Insert some text (*ValidMacroInsert*)
Some text Invalid Macro Insert *) some text (*ValidMacroInsert*)";
string result1 = Regex.Replace(str, @"(?m)\(\*(?=(?:(?!\(\*|\*\)).)*\(|$)", "<");
string result2 = Regex.Replace(result1, @"(?<!\(\*(?:(?!\(\*|\*\)).)*)\*\)", ">");
Console.WriteLine(result2);