问题描述
要配置的内容如下:{#ForeachBegin($Fields)}private{$CLRType}{$LowerFieldName};{#ForeachEnd}public{$ModelClassName}({#ForeachBegin($Fields)}{$CLRType}{$LowerFieldName}{#ForeachEnd}){{#ForeachBegin($Fields[rn])}this.{$LowerFieldName}={$LowerFieldName};{#ForeachEnd}}我写的正则表达式如下:{#ForeachBegin($(?<items>[w|.]+)}(?<itemTemplate>.+?){#ForeachEnd}现在的问题是,如果使用不使用RegexOptions.Singleline选项,则public{$ModelClassName}({#ForeachBegin($Fields)}{$CLRType}{$LowerFieldName}{#ForeachEnd}){{#ForeachBegin($Fields[rn])}this.{$LowerFieldName}={$LowerFieldName};{#ForeachEnd}}能正确匹配,但是{#ForeachBegin($Fields)}private{$CLRType}{$LowerFieldName};{#ForeachEnd}无法匹配.如果使用RegexOptions.Singleline选项,则匹配的结果为{#ForeachBegin($Fields)}private{$CLRType}{$LowerFieldName};{#ForeachEnd}public{$ModelClassName}({#ForeachBegin($Fields)}{$CLRType}{$LowerFieldName}{#ForeachEnd}){{#ForeachBegin($Fields[rn])}this.{$LowerFieldName}={$LowerFieldName};{#ForeachEnd}(注意这里没有"}")也就是说他直接配置了全部内容,显示不是我希望得到的结果,我希望配置内容为3个{#ForeachBegin($Fields)}private{$CLRType}{$LowerFieldName};{#ForeachEnd}{#ForeachBegin($Fields)}{$CLRType}{$LowerFieldName}{#ForeachEnd}{#ForeachBegin($Fields[rn])}this.{$LowerFieldName}={$LowerFieldName};{#ForeachEnd}参考.net说明,(?<itemTemplate>.+?)这里使用"+?"就是尽可能少的配置该项,但是没有效果.请问到底怎么写才能满足要求,谢谢!
解决方案
解决方案二:
MacK,现在下班,等下再看^_^
解决方案三:
LZ试试这个{#ForeachBegin($(?<items>[^)]+))}(?<itemTemplate>[sS]+?){#ForeachEnd}
解决方案四:
Multiline它与输入字符串中的行数没有关系。确切地说,它只修改^和$的方式,以便匹配行开始(BOL)和行结尾(EOL),而不是匹配整个输入字符串的开始和结尾。IgnoreCase使模式在匹配搜索字符串时忽略大小写。IgnorePatternWhitespace允许根据需要在模式中包括任意数量的空白区域,也支持使用(?#注释#)语法在模式中加入注释。SingleLine它与输入字符串中的行数没有关系。更确切地说,它将导致.(句点)元字符匹配任意字符,而不是除n之外的任意字符(默认情况)。
解决方案五:
谢谢楼上的,使用[sS]解决了,奇怪[sS]与使用RegexOptions.Singleline选项的.都是配置所有字符啊,为什么结果不一样呢
解决方案六:
如果不是楼主贴错了,那可能就是楼主的试验环境或是试验方法有问题======================================楼主确认以下的写法{#ForeachBegin($(?<items>[w¦.]+)}(?<itemTemplate>.+?){#ForeachEnd}
在不加RegexOptions.Singleline参数时可以匹配到{#ForeachBegin($Fields[rn])}this.{$LowerFieldName}={$LowerFieldName};{#ForeachEnd}这一行吗?按你的写法,这一行是匹配不到的,它正则匹配的结果只能是{#ForeachBegin($Fields)}{$CLRType}{$LowerFieldName}{#ForeachEnd}这一行问题出在(?<items>[w¦.]+上PS:楼主的这个命名捕获组少一个“)”在[]中必须转义的字符有“[”、“]”、“”,在[]特殊位置才需要转义的字符有“^”、“-”,其它的一般来说在[]内都不需要用“”转义。在[]中,“.”与“.”没有区别,都是匹配小数点本身,而“|”是多余的,在[]中,默认即有“或”的关系,加上“|”只会多匹配一个普通字符“|”,也就是说,[w¦.],只能匹配数字,大小写字母,“|”或者“.”中的任意一个,此时这个捕获组将无法匹配Fields[rn],所以不在RegexOptions.Singleline参数的情况下,楼主的正则只能匹配{#ForeachBegin($Fields)}{$CLRType}{$LowerFieldName}{#ForeachEnd}这一行=====================================如果使用RegexOptions.Singleline选项,则匹配的结果为{#ForeachBegin($Fields)}private{$CLRType}{$LowerFieldName};{#ForeachEnd}public{$ModelClassName}({#ForeachBegin($Fields)}{$CLRType}{$LowerFieldName}{#ForeachEnd}){{#ForeachBegin($Fields[rn])}this.{$LowerFieldName}={$LowerFieldName};{#ForeachEnd}(注意这里没有"}")-----------------------------------------------------加了RegexOptions.Singleline参数后,如果正则是这样{#ForeachBegin($(?<items>[w¦.]+)}(?<itemTemplate>.+){#ForeachEnd}
也就是在.+后少了?时,是楼主所给的结是,这是由于贪婪模式的关系,但是如果是楼主所给的正则,也就是有?时,那应该分别匹配如下结果1{#ForeachBegin($Fields)}private{$CLRType}{$LowerFieldName};{#ForeachEnd}2{#ForeachBegin($Fields)}{$CLRType}{$LowerFieldName}{#ForeachEnd}====================================1楼的写法是正确的如果不想用[sS],而是用RegexOptions.Singleline参数,那么这样写加RegexOptions.Singleline参数,所得结果也是一样的{#ForeachBegin($(?<items>[^)]+))}(?<itemTemplate>.+?){#ForeachEnd}
解决方案七:
不好意思,应该是2楼的写法是正确的