多行正则表达式问题

wolve 2007-11-12 04:55:02
要配置的内容如下:
{#ForeachBegin($Fields)}
private {$CLRType} {$LowerFieldName};
{#ForeachEnd}

public {$ModelClassName}({#ForeachBegin($Fields)}{$CLRType} {$LowerFieldName}{#ForeachEnd})
{
{#ForeachBegin($Fields[\r\n])}this.{$LowerFieldName} = {$LowerFieldName};{#ForeachEnd}
}

我写的正则表达式如下:
\{#ForeachBegin\(\$(?<items>[\w|\.]+\)}(?<itemTemplate>.+?)\{#ForeachEnd}

现在的问题是,如果使用不使用RegexOptions.Singleline选项,则
public {$ModelClassName}({#ForeachBegin($Fields)}{$CLRType} {$LowerFieldName}{#ForeachEnd})
{
{#ForeachBegin($Fields[\r\n])}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[\r\n])}this.{$LowerFieldName} = {$LowerFieldName};{#ForeachEnd}
(注意这里没有"}")
也就是说他直接配置了全部内容,显示不是我希望得到的结果,我希望配置内容为3个
{#ForeachBegin($Fields)}
private {$CLRType} {$LowerFieldName};
{#ForeachEnd}

{#ForeachBegin($Fields)}{$CLRType} {$LowerFieldName}{#ForeachEnd}

{#ForeachBegin($Fields[\r\n])}this.{$LowerFieldName} = {$LowerFieldName};{#ForeachEnd}

参考.net说明,(?<itemTemplate>.+?)这里使用"+?"就是尽可能少的配置该项,但是没有效果.

请问到底怎么写才能满足要求,谢谢!



...全文
100 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
root_ 2007-11-12
  • 打赏
  • 举报
回复
不好意思,应该是2楼的写法是正确的
root_ 2007-11-12
  • 打赏
  • 举报
回复
如果不是楼主贴错了,那可能就是楼主的试验环境或是试验方法有问题

======================================
楼主确认以下的写法
\{#ForeachBegin\(\$(?<items >[\w¦\.]+\)}(?<itemTemplate>.+?)\{#ForeachEnd}

在不加RegexOptions.Singleline参数时可以匹配到
{#ForeachBegin($Fields[\r\n])}this.{$LowerFieldName} = {$LowerFieldName};{#ForeachEnd}
这一行吗?
按你的写法,这一行是匹配不到的,它正则匹配的结果只能是
{#ForeachBegin($Fields)}{$CLRType} {$LowerFieldName}{#ForeachEnd}
这一行

问题出在(?<items >[\w¦\.]+上
PS:楼主的这个命名捕获组少一个“)”
在[]中必须转义的字符有“[”、“]”、“\”,在[]特殊位置才需要转义的字符有“^”、“-”,其它的一般来说在[]内都不需要用“\”转义。在[]中,“\.”与“.”没有区别,都是匹配小数点本身,而“|”是多余的,在[]中,默认即有“或”的关系,加上“|”只会多匹配一个普通字符“|”,也就是说,[\w¦\.],只能匹配数字,大小写字母,“|”或者“.”中的任意一个,此时这个捕获组将无法匹配Fields[\r\n],所以不在RegexOptions.Singleline参数的情况下,楼主的正则只能匹配
{#ForeachBegin($Fields)}{$CLRType} {$LowerFieldName}{#ForeachEnd}
这一行

=====================================
如果使用RegexOptions.Singleline选项,则匹配的结果为
{#ForeachBegin($Fields)}
private {$CLRType} {$LowerFieldName};
{#ForeachEnd}

public {$ModelClassName}({#ForeachBegin($Fields)}{$CLRType} {$LowerFieldName}{#ForeachEnd})
{
{#ForeachBegin($Fields[\r\n])}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楼的写法是正确的
如果不想用[\s\S],而是用RegexOptions.Singleline参数,那么这样写加RegexOptions.Singleline参数,所得结果也是一样的
\{#ForeachBegin\(\$(?<items>[^)]+\))}(?<itemTemplate>.+?)\{#ForeachEnd}


wolve 2007-11-12
  • 打赏
  • 举报
回复
谢谢楼上的,使用[\s\S]解决了,奇怪[\s\S]与使用RegexOptions.Singleline选项的.都是配置所有字符啊,为什么结果不一样呢
symbol441 2007-11-12
  • 打赏
  • 举报
回复
Multiline
它与输入字符串中的行数没有关系。确切地说,它只修改 ^ 和 $ 的方式,以便匹配行开始 (BOL) 和行结尾 (EOL),而不是匹配整个输入字符串的开始和结尾。

IgnoreCase
使模式在匹配搜索字符串时忽略大小写。

IgnorePatternWhitespace
允许根据需要在模式中包括任意数量的空白区域,也支持使用 (?# 注释 #) 语法在模式中加入注释。

SingleLine
它与输入字符串中的行数没有关系。更确切地说,它将导致 .(句点)元字符匹配任意字符,而不是除 \n 之外的任意字符(默认情况)。
wuhq030710914 2007-11-12
  • 打赏
  • 举报
回复
LZ试试这个
\{#ForeachBegin\(\$(?<items>[^)]+\))}(?<itemTemplate>[\s\S]+?)\{#ForeachEnd}
wangkun9999 2007-11-12
  • 打赏
  • 举报
回复
MacK,现在下班,等下再看^_^

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧