【问题标题】:avoid in between character in regex pattern避免在正则表达式模式中的字符之间
【发布时间】:2021-01-20 01:18:01
【问题描述】:

我正在尝试在具有特定属性的所有文件中查找组件。尝试了这个正则表达式模式<Button[^>]*[\n\s]+className[^>]*>。 95% 可以正常工作。

Regex Example

您可以在上面的示例中看到。具有条件属性的按钮组件将不匹配。它也有 className 属性。它应该匹配。由于条件属性行中的大于字符 =>,它不匹配。所以,它甚至在组件关闭标记之前就停止了。

如何避免在此正则表达式模式中大于字符 (>) 之间出现?

【问题讨论】:

  • 你不应该使用正则表达式来解析 HTML:stackoverflow.com/questions/1732348/…
  • 或者实际上除了最简单的情况 (IMO) 正则表达式之外的任何内容都会产生难以阅读和调试的代码,而且似乎甚至可能无法使用正则表达式解析 html。
  • 抱歉,您希望得到什么结果?按钮标签之间的所有条目(包括所有属性)?
  • <Button(?:\w+={[^{}]*}|[^>])*\sclassName=(?:\w+={[^{}]*}|[^>])*>。见regex101.com/r/SGB0aN/4
  • @ChristianBaumann 请不要使用该链接来解释为什么不应该使用正则表达式进行 HTML 解析。 OP不会理解的。这是我整理的一个更具说明性的页面:htmlparsing.com/regexes.html

标签: regex html-parsing


【解决方案1】:

您需要匹配除> 或属性(一大块单词字符)之外的任何字符,后跟=,然后将花括号之间的子字符串与(?:\w+=\{[^{}]*\}|[^>])* 匹配一次或多次。

此外,您应该记住,Visual Studio Code 正则表达式引擎需要在字符类之外转义 {}

图案看起来像

<Button(?:\w+=\{[^{}]*\}|[^>])*\sclassName=(?:\w+=\{[^{}]*\}|[^>])*>

请参阅regex demo

详情

  • &lt;Button - 文字字符串
  • (?:\w+=\{[^{}]*\}|[^&gt;])* - 零次或多次重复
    • \w+=\{[^{}]*\} - 一个或多个字母、数字或下划线、={、除{} 之外的零个或多个字符,然后是}
    • | - 或
    • [^&gt;] - 除&gt; 之外的任何字符
  • \s - 一个空格
  • className= - 文字文本
  • (?:\w+=\{[^{}]*\}|[^&gt;])* - 见上文
  • &gt; - 一个 &gt; 字符。

【讨论】:

  • 很抱歉通过评论问你。这个不匹配&lt;Button onChange={(value) =&gt; {this.state;}} className={style.textArea}&gt;&lt;/Button&gt;
  • @KaruppiahRK 是的,因为嵌套的花括号。无论您是否可以解决,您都应该命名您正在使用的正则表达式库。
  • 正则表达式库名是什么意思?对不起,我不明白。我试图解决它。但不能。我没有足够的正则表达式知识。
  • @KaruppiahRK 编程语言是什么?
  • @KaruppiahRK 如果您只有一个嵌套括号级别,您可以使用&lt;Button(?:\w+=\{[^{}]*(?:\{[^{}]*\}[^{}]*)*\}|[^&gt;])*\sclassName=(?:\w+=\{[^{}]*(?:\{[^{}]*\}[^{}]*)*\}|[^&gt;])*&gt;,请参阅this regex demo
猜你喜欢
  • 2017-08-17
  • 2012-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-14
  • 2016-04-24
相关资源
最近更新 更多