我正在使用以下正则表达式在我的代码之间进行读取,直到我遇到标记中我的数据中嵌入了<
符号的情况。要解决这个问题,我想在+>
和</+
之间进行阅读。我无法在我正在使用的数据库中使用该组合。当我尝试更改下面的代码来执行此操作时,我遇到了问题。有什么想法吗?
代码:
@fieldValues = $inFileLine =~ m(>([^<]+)<)g;
我很抱歉尝试修改代码:
@fieldValues = $inFileLine =~ m(\+>([^<\/\+]+)<\/\+)g;
数据:
<+RecordID+>SWCR000111</+RecordID+><+Title+>My Title Is < Than Yours</+Title+>
答案 0 :(得分:1)
由于 +>
无法跟随<+
,因此它适合您,我将发表评论作为答案。
即使对于非常大的文件,这个正则表达式也应该是安全的:
\+>(?!<\+)([^<]*(?:<(?!\/\+)[^<]*)*)<\/\+
请参阅regex demo
这是它正在做的事情:
\+>(?!<\+)
- 匹配+>
(与\+>
)匹配的<+
未跟(由于否定前瞻(?!<\+)
)([^<]*(?:<(?!\/\+)[^<]*)*)
- 匹配并存储在第1组中
[^<]*
- 除<
以外的0个或多个字符后跟... (?:<(?!\/\+)[^<]*)*
- 0个或更多个序列...
<(?!\/\+)
- <
未跟/+
然后[^<]*
- 除<
<\/\+
- 匹配最终的</+
简而言之,这与\+>(?!<\+)([\s\S]*?)<\/\+
相同,但是&#34;解开&#34;使用展开循环技术,允许分隔符之间的大部分文本(即+>
和最近的</+
之间)。
答案 1 :(得分:0)
更新:由于您只是寻找简单,所以您不必为了 超越标记分隔符的定义 这是因为您根本不解析标记的定义。
解决方案归结为这个非常简单的正则表达式 -
查找:<(?!/?\+)
替换:<
如果你想继续误解+> .. </+
描述的话
标签之间的东西,这是原始的。
通常,它是在逐个字符的基础上使用否定断言完成的。
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