0

我研究了 stackoverflow 并找到了类似的结果,但这并不是我真正想要的。

给定一个 xml 字符串:"<a b=\"c\"></a>"在 javascript 上下文中,我想创建一个正则表达式来捕获包括引号在内的属性值

注意:如果您使用单引号,则类似。

目前我有一个为 XML 规范量身定制的正则表达式:

[_A-Za-z][\w\.\-]*(?:=\"[^\"]*\")?

[_A-Za-z][\w\.\-]*     //This will match the attribute name.
(?:=\"[^\"]*\")?       //This will match the attribute value.


\"[^\"]*\"             //This part concerns me.

我现在的问题是,如果 xml 字符串如下所示:

<shout statement="Hi! \"Richeve\"."></shout>

我知道这是一个愚蠢的问题,但我只想捕捉这种情况可能发生的罕见情况(我知道编码器可以在这种情况下使用单引号)但有些情况我们不知道当前值属性,因为属性值在运行时动态变化。

因此,为了使这一点更清楚,使用正确的正则表达式的结果应该是:

"Hi! \"Richeve\"."

我希望我的问题很清楚。感谢所有的帮助!

PS:请注意,语言上下文是 Javascript,我知道使用lookbehinds 很诱人,但目前不支持lookbehinds。

PS:我知道解析 XML 真的很难,但我有一个优雅的解决方案:) 所以我只需要解决这个小问题。所以这个问题唯一的主要焦点是捕获在字符串标记内包含引号的带引号的字符串标记。

4

2 回答 2

0

描述

我非常确定在双引号属性值中嵌入双引号是不合法的。您可以在值内使用双引号的 unicode 等效项\x22

然而,要回答这个问题,这个表达式将:

  • 允许在属性值中使用转义引号
  • 捕获属性statement的值
  • 允许属性在标签内以任意顺序出现
  • 将避免许多边缘情况,这些情况会导致 html 文本中的模式匹配出错
  • 不使用lookbehinds

<shout\b(?=\s)(?=(?:[^>=]|='(?:[^']|\\')*'|="(?:[^"]|\\")*"|=[^'"][^\s>]*)*?\sstatement=(['"])((?:\\['"]|.)*?)\1(?:\s|\/>|>))(?:[^>=]|='(?:[^']|\\')*'|="(?:[^"]|\\")*"|=[^'"][^\s>]*)*>.*?<\/shout>

在此处输入图像描述

例子

示例文本

请注意第一个属性中的困难边缘情况:)

<shout onmouseover=' statement="He said \"I am Inside the onMouseOver\" " ; if ( 6 > a ) { funRotate(statement) } ; ' statement="Hi! \"Richeve\"." title="sometitle">SomeString</shout>

火柴

第 0 组获取从打开到关闭的整个标签
第 1 组获取语句属性值周围的引号,这用于正确匹配结束引号
第 2 组获取语句属性值,其中可能包括转义引号,\"但不包括周围的引号

[0][0] = <shout onmouseover=' statement="He said \"I am Inside the onMouseOver\" " ; if ( 6 > a ) { funRotate(statement) } ; ' statement="Hi! \"Richeve\"." title="sometitle">SomeString</shout>
[0][1] = "
[0][2] = Hi! \"Richeve\".
于 2013-08-01T12:37:01.680 回答
0

具有匹配分隔符和嵌入转义分隔符的内容的标准模式如下所示:

"[^"\\]*(?:\\.[^"\\]*)*"

忽略模式中明显的第一个和最后一个字符,以下是模式其余部分的工作方式:

[^"\\]*:使用所有字符,直到分隔符或反斜杠(Hi!在您的示例中匹配)

(?:\\.[^"\\]*)*尝试重复使用单个转义字符\\.,后跟一系列非定界符/反斜杠字符(在您的示例中\"Richeve先匹配,然后再匹配)\".

而已。

您可以尝试使用更通用的分隔符方法,使用(['"])和反向引用,或者您可以只允许使用单引号的替代模式,如下所示:

("[^"\\]*(?:\\.[^"\\]*)*"|'[^'\\]*(?:\\.[^'\\]*)*')

下面是对这种技术的另一种描述,它也可能有所帮助(参见名为字符串的部分):http ://www.regular-expressions.info/examplesprogrammer.html

于 2013-08-01T04:47:34.490 回答