【问题标题】:How to do multiline search using regular expression?如何使用正则表达式进行多行搜索?
【发布时间】:2010-12-09 01:09:01
【问题描述】:

我是正则表达式的新手。

我想做多行搜索。这是我想要做的示例:

假设我有以下文字:

*项目#1: CVC – 客户价值创造(2007 年 9 月 – 至今) 时代华纳有线电视是世界领先的媒体和娱乐公司,时代华纳有线电视(TWC)制造同轴电筒。 客户:时代华纳有线电视,美国。 ETL 工具:Informatica 7.1.4 数据库:Oracle 9i。 角色:ETL 开发人员/团队负责人。 操作系统:UNIX。 职责: 制定了测试计划和测试用例书。 同行评审的团队成员映射。 记录的映射。 领导开发团队。 将报告发送到现场。 缺陷、数据和性能相关的错误修复。 项目#2: MYER - 销售分析系统(2005 年 11 月 - 至今) Coles Myer 是澳大利亚最大的零售商之一,在澳大利亚拥有 2,000 多家门店, 客户:澳大利亚Coles Myer 零售店。 ETL 工具:Informatica 7.1.3 数据库:Oracle 8i。 角色:ETL 开发人员。 操作系统:UNIX。 职责: 使用 Informatica 提取、转换和加载数据。 了解整个源系统。 创建并运行会话和工作流。 使用 Syncsort 应用程序创建排序文件。*

我想编写正则表达式,它应该首先尝试匹配可以是小写或大写的单词“Project”。

如果“项目”匹配,那么 RegEx 应该尝试匹配客户端、角色、环境。 如果正则表达式。匹配其中任何一个,则匹配完成。 (客户、角色、环境等词在任何情况下都可以与“项目”一词在同一行,也可以不在同一行)

我为上述任务编写了一个正则表达式,如下所示:

^((P|p)roject.*\s*.*((((E|e)nviornment)|((P|p)latform)|((R|r)ole(s)?)|((R|r)esponsibilit(y|ies))|((C|c)lient)|((C|c)ustomer)|((P|p)eriod)))

这个正则表达式。匹配项目#1,但不匹配项目#2。

谁能告诉我这个正则表达式有什么问题或者如何为这种文本编写正则表达式?

【问题讨论】:

  • 您使用的是哪种编程语言?

标签: .net regex multiline


【解决方案1】:

如果是 C#,您可以将 Multiline 选项指定为 Regex 构造函数的参数:

Regex r = new Regex("(var matches = new Array\\([^\\)]*\\);)",  
          RegexOptions.IgnoreCase | RegexOptions.Compiled 
          | RegexOptions.Multiline);

更多代码详情请参考链接:C# and Regex: How to extract strings between quotation marks

【讨论】:

  • 非常感谢您的快速回复!
【解决方案2】:

试试这个:

Regex project = new Regex(
   @"^(Project [\s\S]*?" + 
   @"(Environment|Platform|Roles?|Responsibilit(y|ies)|Client|Customer|Period))",
   RegexOptions.ECMAScript | RegexOptions.IgnoreCase | RegexOptions.Multiline);

【讨论】:

    【解决方案3】:

    由于您没有指定编程语言,这里有一些常用的模式来完成此操作

    /yourRegexpattern/m  <-- the m stays for multiline
    

    你也可以使用

    /yourRegexpattern/im <-- the i stays for case insensitivity
    

    消除对(P|p) 等的需求。

    在 C# 中,您必须在正则表达式的构造函数中指定这些标志,只需使用自动补全。

    【讨论】:

    • 感谢您的快速回复。我正在使用 C# 来完成这项任务,但为了测试正则表达式,我使用的是 Expresso 编辑器。在 Expresso 中,这个正则表达式不起作用。它可以搜索“Project #1”,但不能搜索“Project #2”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    • 2019-02-18
    • 1970-01-01
    相关资源
    最近更新 更多