【问题标题】:Regex to validate macros in text正则表达式验证文本中的宏
【发布时间】:2015-01-12 01:51:54
【问题描述】:

我正在尝试构建一个正则表达式来验证可以包含以下格式的宏的文本:

Some text (*MacroIDInsert*) some text continues..

我想检测宏不存在的情况

  1. 正确关闭(例如“(*”而不关闭“*)”)
  2. 正确打开(例如“*)”而不打开“(*”)

我想检测的无效案例示例:

Some text (* Invalid Macro Insert some text (*ValidMacroInsert*)

Some text Invalid Macro Insert *) some text (*ValidMacroInsert*)

我想匹配缺少随附括号的(* 或 *)。并可能相应地用 替换“坏”的,例如:

Some text Invalid Macro Insert > some text (*ValidMacroInsert*)

使用正则表达式可以实现吗?

更新: 进一步澄清表明,文本可能包含 嵌套 宏,例如:

Some text (*MacroID1(*MacroID2*)*) some text continues..

在这种情况下,我的理解是无法判断要替换哪个“无效”括号... 例如,考虑以下结构:

(*id1*) (*id2*) (* (*id3*) (* id5 (*id4*) *)
                ^^?        ^^?

在这种情况下,我们不知道(上面)标记的两个括号中的哪一个是不正确的......

【问题讨论】:

  • 您使用的是哪种语言?

标签: regex parsing macros escaping text-parsing


【解决方案1】:

如果你的语言支持PCRE动词(*SKIP)(*F),我确实使用了。

\(\*(?:(?!\(\*|\*\)).)*\*\)(*SKIP)(*F)|(?:\(\*|\*\))

DEMO

也就是说,使用这个\(\*(?:(?!\(\*|\*\)).)*\*\)(*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);

IDEONE

【讨论】:

  • 非常感谢 Avinash,虽然我使用的是 .NET 正则表达式引擎,但我认为它不支持 PCRE 动词(除非使用 PCRE C# 包装器,但不幸的是我目前无法使用它.. .)
  • 要匹配结尾的)*,试试这个(?&lt;!\(\*(?:(?!\(\*|\*\)).)*)\*\)
  • 哦,你可以将第一个正则表达式简化为\(\*(?!(?:(?!\(\*|\*\)).)*\*\))
  • 太棒了,但现在我开始明白为什么这还没有在我们的系统中实现——我认为有一个特定的要求几乎不可能正确地转义无效标签......我会更新原来的关于这些细节的问题。
  • 我会接受你的回答,因为它解决了最初提出的问题:) 但是嵌套宏问题有点复杂...... :(
猜你喜欢
  • 1970-01-01
  • 2011-03-10
  • 1970-01-01
  • 2016-08-24
  • 1970-01-01
  • 2021-05-07
  • 1970-01-01
  • 2016-09-10
  • 1970-01-01
相关资源
最近更新 更多