.Net Regex - 需要帮助

时间:2013-11-27 15:37:26

标签: .net regex

更新

我需要一个能找到"@[..[...]]"模式的正则表达式的帮助。

我会尝试解释。

文本将包含占位符,在显示相同文本时将替换为值。

占位符有3个部分;

  • 一个开放标签,以" @ ["其次是"点分隔文本"并以" [",
  • 结束
  • 一个属性列表,一个以逗号分隔的列表" qouted(double qoutes)值,
  • 关闭标记,"]]"。

属性列表项可以包含一个或多个占位符(嵌套)以及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"]]"]]

3 个答案:

答案 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>.+)"\]\]