我需要一个能找到"@[..[...]]"
模式的正则表达式的帮助。
我会尝试解释。
文本将包含占位符,在显示相同文本时将替换为值。
占位符有3个部分;
属性列表项可以包含一个或多个占位符(嵌套)以及double qoutes(转义)和括号。
正则表达式必须通过知道何时到达"外部"的结尾来克服嵌套占位符的问题。占位符以及任何转义的qoutes和括号。
样品
考虑以下文本片段:
Linklist
@[Link.AppText["[startpage]", "startpage"]]
@[Link.Text["[startpage] loggedin", "The \"@[Text.AppText["startpage"]]\" for users"]]
@[Link.Text["@[Link["startpage"]]", "@[Text.AppText["startpage"]]"]]
匹配应如下所示:
match 1 = @[Link.AppText["[startpage]", "startpage"]]
Gr.1 = Link.AppText
Gr.2 = "[startpage]", "startpage"
match 2 = @[Link.Text["[startpage] loggedin", "The \"@[Text.AppText["startpage"]]\" for users"]]
Gr.1 = Link.Text
Gr.2 = "[startpage] loggedin", "The \"@[Text.AppText["startpage"]]\" for users"
match 3 = @[Link.Text["@[Link["startpage"]]", "@[Text.AppText["startpage"]]"]]
Gr.1 = Link.Text
Gr.2 = "@[Link["startpage"]]", "@[Text.AppText["startpage"]]"
通过@ridgerunner的解决方案,我解决了它:
@\[([._\w]+)\[([^[\]""]*(?:""[^""\\]*(?:\\.[^""\\]*)*""[^[\]""]*)*)\]\]
@\[ # Outer open delimiter.
([._\w]+) # 1:st group.
\[ # Inner open delimiter.
( # Start of 2:nd group.
[^[\]""]* # Contents.
(?:""[^""\\]*(?:\\.[^""\\]*)*"" # Contents.
[^[\]""]*)* # Contents.
) # End of 2:nd group.
\]\] # Close delimiter.
并且......对于那些寻找平衡群体解决方案的人来说,#34;
...在努力进行谷歌搜索和大量的正则表达式测试之后,我终于想出了另一个有效的解决方案,虽然我不得不稍微改变模式以使其工作:(至少对我而言:))
Regex: @([._\w]+)\[\[(""(?:[^\[\]]*|\[[^\[]|[^\]]\]|(?<counter>\[\[)|(?<-counter>\]\]))+(?(counter)(?!))"")\]\] @([._\w]+)\[\[ # start tag, 1:st group ("" # start 2:nd group (?: # non capturing group [^\[\]]* # any char but [ or ] | # or \[[^\[] # if [, not followed by a [ | # or [^\]]\] # if ], not followed by a ] | # or (?<counter>\[\[) # counter start tag | # or (?<-counter>\]\]) # counter stop tag )+ # end non capturing group (?(counter)(?!)) # if counter <> 0, regex fails "") # end 2:nd group \]\] # end tag
使用新模式更新占位符; (@..[[...]]
Linklist @Link.AppText[["[startpage]", "startpage"]] @Link.Text[["[startpage] loggedin", "The \"@Text.AppText[["startpage"]]\" for users"]] @Link.Text[["@Link[["startpage"]]", "@Text.AppText[["startpage"]]"]]
答案 0 :(得分:1)
假设所引用的部分没有任何转义的字符,那么这个部分会做得很好:
if (Regex.IsMatch(subjectString, @"
# Match @[...[...]...] pattern outside quotes.
@\[ # Outer open delimiter.
[^[\]]* # Link text.
\[ # Inner open delimiter.
[^[\]""]*(?:""[^""]*""[^[\]""]*)* # Contents.
\]\] # Close delimiter.
", RegexOptions.IgnorePatternWhitespace)) {
// Successful match
} else {
// Match attempt failed
}
请注意,如果引用内容 包含转义字符(例如"foo\"bar\"foo"
或.NET双引号语法:@"foo""bar""foo"
),则可以修改模式以处理那也是。
答案 1 :(得分:0)
这是做什么的?
# @"(?-s)@\[([.\w]+)\[""(.*)""\]\]"
(?-s)
@\[
( [.\w]+ )
\["
( .* )
"\]\]
答案 2 :(得分:0)
这可能会有所帮助。 outer
组将包含Link.AppText
部分,inner
组将包含内部部分。
@\[(?<outer>[^[]+?)\["(?<Inner>.+)"\]\]