多行正则表达式问题

问题描述

要配置的内容如下:{#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楼的写法是正确的

时间: 2024-11-13 04:03:16

多行正则表达式问题的相关文章

JavaScript正则表达式之multiline属性的应用

        这篇文章主要介绍了JavaScript正则表达式之multiline属性的应用,是JS学习进阶中的重要知识,需要的朋友可以参考下             多行正则表达式是对象的只读布尔属性.它指定是否一个特定的正则表达式进行多行匹配,即,不管是否使用"m"属性创建. 语法 ? 1 RegExpObject.multiline 下面是参数的详细信息: NA 返回值: 如果"m"修改被设置返回"TRUE",否则返回"FALS

JavaScript正则表达式之multiline属性的应用_基础知识

 多行正则表达式是对象的只读布尔属性.它指定是否一个特定的正则表达式进行多行匹配,即,不管是否使用"m"属性创建.语法 RegExpObject.multiline 下面是参数的详细信息:     NA 返回值: 如果"m"修改被设置返回"TRUE",否则返回"FALSE". 例子: <html> <head> <title>JavaScript RegExp multiline Prope

Linux服务器上用iScanner删除网页恶意代码的方法

  Linux服务器上怎么用iScanner删除网页恶意代码?这篇文章主要介绍了Linux服务器上用iScanner删除网页恶意代码的方法,iScanner为Ruby编写,所以服务器上要首先安装Ruby解释器,需要的朋友可以参考下 第一步:安装 首先要确保服务器上已经安装了Ruby 代码如下: #ruby -v //查看ruby的版本信息 如果服务器上没有安装,可以通过yum或者apt-get安装ruby(根据自己服务器系统选择对应的方法安装) 代码如下: #yum install ruby /

UNIX 高手的 20 个习惯[转]

使用 mkdir 的 -p 选项并在单个命令中创建所有父目录及其子目录要容易得多.但是即使对于知道此选项的管理员,他们在命令行上创建子目录时也仍然束缚于逐步创建每级子目录.花时间有意识地养成这个好习惯是值得的. 清单 2. 好习惯 1 的示例:使用一个命令来定义目录树~ $ mkdir -p tmp/a/b/c您可以使用此选项来创建整个复杂的目录树(在脚本中使用是非常理想的),而不只是创建简单的层次结构.清单 3. 好习惯 1 的另一个示例:使用一个命令来定义复杂的目录树~ $ mkdir -p

求教php大神,这个应该怎么改啊,输入150号段,和140- 号段,输入会显示错误

问题描述 求教php大神,这个应该怎么改啊,输入150号段,和140- 号段,输入会显示错误 输入150号段,和140- 号段,输入会显示 解决方案 贴出个图,也不说遇到了什么问题,鬼才知道怎么改 解决方案二: 而且你的图都不全,代码右边一半还看不到. 解决方案三: 你看你第5行正则表达式13[0-9]{9}很明显是 13开头,后面跟10个数字,能匹配14.15么?

FXiTE 0.8发布 高级文本编辑器

FXiTe是一款高级的跨平台http://www.aliyun.com/zixun/aggregation/18444.html">文本编辑器,采用Fox GUI工具包和FXScintilla文本构件开发设计.其特点是具有40多种语言的内置语法,一个嵌入式Lua脚本引擎,宏录制和播放功能,多行正则表达式搜索和替换功能,基本的ctags和calltip支持,灵活的接口到外部工具,以及一个内置的消息窗口来获取外部命令. FXiTE 0.8该版本添加软换行的功能,支持国际键盘进行了改进,支持组合

正则表达式的多行模式与单行模式

测试"多行模式" 测试一 注意:这里样例文本中3eeeee后面没有回车,光标就在e的后面.匹配的结果是3eeeee,如上图的Search Results区中所示. 为什么这里不能匹配1abcde和2abc? 开启多行模式 ^ 可以匹配字符串开头(字符串的开始位置),也可以匹配行的开头(即换行符\n之后的位置) $ 可以匹配字符串结尾(字符串的结束位置), 也可以匹配行的结尾(即换行符\n之前的位置) 关闭多行模式 ^ 只能匹配字符串开头 $ 只能匹配字符串结尾 知识点:\r为回车符,\

httpunit-java 正则表达式 抓取2行特定中文词语中的一段中文

问题描述 java 正则表达式 抓取2行特定中文词语中的一段中文 老师让我们做一个能从汉字网站http://hanyu.iciba.com上抓取汉字信息的爬虫,现在遇到了一个难题,下面是我用httpunit解析出来的某个字的部分信息. 龙 繁体 龍 笔画 5笔 造字法 原为形声 部首 龙部 五笔 DXV 结构 单一结构 比如说现在我要截取这个字的部首,也就是部首和五笔这2行字中间的那段字,那正则表达式是不是就是"部首.五笔",但是这样做了之后什么也没有截取出来,能告诉我怎么写这个表达式

在asp.net中 判断不能小于0 大于360的 判断方法 正则表达式也行

问题描述 在asp.net中 判断不能小于0 大于360的 判断方法 正则表达式也行 在asp.net中 判断不能小于0 大于360的 判断方法 正则表达式也行 解决方案 string s = "123"; int i = int.Parse(s); if (i >= 0 && i <= 360) ... 正则 (d{1,2})|([1-2]d{2})|(3[1-5]d)|(360) 解决方案二: 范围: 0<i<360 var reg=/^((