正则表达式读取加号

时间:2015-11-19 21:38:05

标签: regex perl

我正在使用以下正则表达式在我的代码之间进行读取,直到我遇到标记中我的数据中嵌入了<符号的情况。要解决这个问题,我想在+></+之间进行阅读。我无法在我正在使用的数据库中使用该组合。当我尝试更改下面的代码来执行此操作时,我遇到了问题。有什么想法吗?

代码:

@fieldValues =  $inFileLine =~ m(>([^<]+)<)g;

我很抱歉尝试修改代码:

@fieldValues =  $inFileLine =~ m(\+>([^<\/\+]+)<\/\+)g;

数据:

<+RecordID+>SWCR000111</+RecordID+><+Title+>My Title Is < Than Yours</+Title+>

2 个答案:

答案 0 :(得分:1)

由于 +>无法跟随<+ ,因此它适合您,我将发表评论作为答案。

即使对于非常大的文件,这个正则表达式也应该是安全的:

\+>(?!<\+)([^<]*(?:<(?!\/\+)[^<]*)*)<\/\+

请参阅regex demo

这是它正在做的事情:

  • \+>(?!<\+) - 匹配+>(与\+>)匹配的<+未跟(由于否定前瞻(?!<\+)
  • ([^<]*(?:<(?!\/\+)[^<]*)*) - 匹配并存储在第1组
    • [^<]* - 除<以外的0个或多个字符后跟...
    • (?:<(?!\/\+)[^<]*)* - 0个或更多个序列...
      • <(?!\/\+) - <未跟/+然后
      • [^<]* - 除<
      • 以外的0个或多个字符
  • <\/\+ - 匹配最终的</+

简而言之,这与\+>(?!<\+)([\s\S]*?)<\/\+相同,但是&#34;解开&#34;使用展开循环技术,允许分隔符之间的大部分文本(即+>和最近的</+之间)。

答案 1 :(得分:0)

更新:由于您只是寻找简单,所以您不必为了 超越标记分隔符的定义 这是因为您根本不解析标记的定义。

解决方案归结为这个非常简单的正则表达式 -

查找:<(?!/?\+)
替换:&lt;

如果你想继续误解+> .. </+描述的话 标签之间的东西,这是原始的。

通常,它是在逐个字符的基础上使用否定断言完成的。

m{\+>((?:(?!\+>|</\+).)*<(?:(?!\+>|</\+).)*)</\+}s

格式化:

 \+>
 (                             # (1 start)
      (?:
           (?! \+> | </\+ )
           . 
      )*
      <
      (?:
           (?! \+> | </\+ )
           . 
      )*
 )                             # (1 end)
 </\+

输出:

 **  Grp 0 -  ( pos 42 , len 29 ) 
+>My Title Is < Than Yours</+  
 **  Grp 1 -  ( pos 44 , len 24 ) 
My Title Is < Than Yours