gpt4 book ai didi

JavaScript RegEx - 返回结果但仍然无法正常工作

转载 作者:行者123 更新时间:2023-11-29 18:22:14 25 4
gpt4 key购买 nike

我正在尝试匹配 DTD 节点,例如此文本:

<!ELEMENT note (to,from,body)>

使用这个正则表达式:

match(/<!ELEMENT\s?(.*?)\s?\(.*?\)>/i)

它返回所需的文本 + 文本“note”——谁能解释为什么?

此外,当我删除“注释”文本两侧的一个或两个空格时,它仍会返回结果,这是不需要的。任何人都可以帮助解释为什么它也这样做吗?

这是我的测试文件:

<!ENTITY Aring "&amp;#197;" >,
<!ENTITY aring "&amp;#229;" >,
<!ENTITY agrave "&amp;#224;" >,
<!ENTITY aacute "&amp;#225;" >,
<!ATTLIST ARTICLE AUTHOR CDATA #REQUIRED>,
<!ATTLIST ARTICLE EDITOR CDATA #IMPLIED>,
<!ATTLIST ARTICLE DATE CDATA #IMPLIED>,
<!ATTLIST ARTICLE EDITION CDATA #IMPLIED>,
<!ELEMENT note (to,from,heading,body)>,
<!ELEMENT to (#PCDATA)>,
<!ELEMENT from (#PCDATA)>,
<!ELEMENT heading (#PCDATA)>,
<!ELEMENT body (#PCDATA)>

在此先感谢您的帮助!

最佳答案

这是正则表达式的样子,通过 automaton 查看它:

Regular expression image

所以你实际上正确地匹配了你想要的,但你也捕获了两个组:

  1. "<!ELEMENT note (to,from,body)"
  2. "note"

但它也会匹配其他类型的字符串,例如:

  • <!ELEMENT%e
(jmopV|)
  • <!ELEMENT r()

不是格式正确的标签。

所以你最好做一个more precise regex,比如:

<!ELEMENT\s+\w+\s+\((\w+, ?)*\w+\)>
  • 这是正则表达式匹配的内容:
    • 文本 <!ELEMENT
    • \s+一个或多个空格
    • \w+一个或多个单词字符
    • \s+一个或多个空格
    • \(真正的括号
    • (一组开始
    • \w+在单词字符上或更多
    • ,一个逗号
    • ?一个或零个空格(可以是 * 零个或多个空格)
    • )*该组的末尾,该组被匹配零次或多次
    • \w+一个或多个单词字符
    • (如果您想匹配右括号前的可选空格,您可能需要添加 \s*)
    • \)右括号字符
    • (如果您想匹配标签末尾之前的可选空格,您可能需要添加 \s*)
    • >结束标记字符

Regular expression image

然后,当你做 match(/<!ELEMENT\s+\w+\s+\((\w+, *)*\w+\)>/i) ,你仍然会得到两组:

  1. "<!ELEMENT note (to,from,body)>"
  2. "from,"

而你必须得到第一组,你只需要得到返回数组的第一个元素:

var match = "<!ELEMENT note (to,from,body)>".match(/<!ELEMENT\s+\w+\s+\((\w+, *)*\w+\)>/i);
if (match !== null)
match = match[0];

如果您想使用正则表达式对象来这样做:

pattern = new RegExp(/<!ELEMENT\s+\w+\s+\((\w+, *)*\w+\)>/i)
match = pattern.exec(text)
if (match !== null)
match = match[0]

这将为您提供第一组匹配(即完整匹配)。

编辑后:

你想要一个适用于这组值的正则表达式:

<!ENTITY Aring "&amp;#197;" >,
<!ENTITY aring "&amp;#229;" >,
<!ENTITY agrave "&amp;#224;" >,
<!ENTITY aacute "&amp;#225;" >,
<!ATTLIST ARTICLE AUTHOR CDATA #REQUIRED>,
<!ATTLIST ARTICLE EDITOR CDATA #IMPLIED>,
<!ATTLIST ARTICLE DATE CDATA #IMPLIED>,
<!ATTLIST ARTICLE EDITION CDATA #IMPLIED>,
<!ELEMENT note (to,from,heading,body)>,
<!ELEMENT to (#PCDATA)>,
<!ELEMENT from (#PCDATA)>,
<!ELEMENT heading (#PCDATA)>,
<!ELEMENT body (#PCDATA)>

所以你想要一个看起来像这样的正则表达式:

/<!ELEMENT\s+\w+\s+\((\#?\w+,\s*)*\#?\w+\s*\)\s*>/

Regular expression image

look it up here

var match = "<!ELEMENT note (to,from,body)>".match(/<!ELEMENT\s+\w+\s+\((\#?\w+,\s*)*\#?\w+\s*\)\s*>/i);
if (match !== null)
match = match[0];

它只匹配 <!ELEMENT...节点,而不是 <!ATTLIST...<!ENTITY...节点。对于那些,match将等于 null .对于 <!ELEMENT...节点,它们将包含匹配节点的完整字符串。

关于JavaScript RegEx - 返回结果但仍然无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17319034/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com