【问题标题】:How to parse what is within <xxx>? [duplicate]如何解析 <xxx> 中的内容? [复制]
【发布时间】:2019-10-06 09:58:04
【问题描述】:

假设我有这样的字符串:

' <xxx > '
' < xxx >'
' < xxx>'
' < xxx'
' xxx<'
' xxx'

解析括号内内容的最简单方法是什么? 如果只有一个括号但没有匹配的括号,我可以抛出错误。

我认为正则表达式可能是最简单的方法?

【问题讨论】:

  • 您很可能不需要正则表达式。但是,您的所有数据示例都在字符串的开头和结尾显示一对括号。会有不止一对括号吗?是否允许括号外的文字?您应该真正描述允许和排除的规则。
  • 你是对的,前 3 个应该成功解析,后 3 个应该失败,因为它们缺少一对平衡的括号,如果你能想到一个没有正则表达式的好方法 lmk谢谢
  • 再一次,你需要在一个字符串中找到多对吗?它们可以嵌套吗?是否允许在对之前和之后使用文本?在不了解全部要求的情况下,我无法给出解决方案。
  • 基本上如果有一对平衡的&lt;&gt; 只是想把文字放在里面,我可以在之后为空格修剪()......如果有多个平衡对你可以返回所有其中,但就我而言,预计只有一对,当然 之一可能会丢失,因此必须考虑到这一点。
  • 那么这些有效吗? &lt; foo &gt; bar &gt; ... foo &lt;bar&gt; baz

标签: javascript node.js regex regex-lookarounds regex-greedy


【解决方案1】:

您可以使用string.match()。这将检查字符串是否有效。

const reg = /\<(.*?)\>/;

// Returns the inner value of the string, or FALSE
const getValue = v => {
  v = v.match(reg);
  return v ? v[1].trim() : false;
}

// Check single value 
let v1 = getValue(' < xxx>');
if (v1 !== false) {
  console.log(v1);
}

// Check multiple values 
const values = [' <xxx > ', ' < xxx >', ' < xxx>', ' < xxx', ' xxx<', ' xxx'];
let v2 = values.map(v => getValue(v));
console.log(v2);

【讨论】:

  • 您应该使用? 字符使.* 对于&lt; xxx&gt; yyy&gt;: /\&lt;(.*?)\&gt;/ 这样的情况不贪婪。我还将正则表达式移出函数,因此每次调用getValue 时都不会重新编译它。最后,如果你想处理任意嵌套的尖括号,例如&lt;&lt;hello&gt;, &lt;there&gt;&gt; 那么你不能简单地用一个正则表达式来完成这个
  • @JacobHull 感谢您的输入:)。我已经更新了我的答案以使用 ? 使 .* 不贪婪,并退出正则表达式。
【解决方案2】:

这可以通过正则表达式\&lt;\s*([^&gt;]+)\s*\&gt; 来实现。这将捕获xxx(两边都没有空格)。

"<xxx>".match(/\<\s*([^>]+)\s*\>/) // [2] = 'xxx'
"<xxx >".match(/\<\s*([^>]+)\s*\>/) // [2] = 'xxx'
"xxx<".match(/\<\s*([^>]+)\s*\>/) // null

【讨论】:

    【解决方案3】:

    在这里,我们可以在我们的第一个捕获组中从左侧滑动所有内容,然后添加我们想要的字符列表,将它们收集到我们的第二个捕获组中:

    ([\s\S]*?)([a-z]+)
    

    const regex = /([\s\S]*?)([a-z]+)/gm;
    const str = ` <xxx >  
      < xxx > 
      < xxx> 
      < xxx 
      xxx< 
      xxx `;
    const subst = `$2\n`;
    
    // The substituted value will be contained in the result variable
    const result = str.replace(regex, subst);
    
    console.log('Substitution result: ', result);

    正则表达式

    如果不需要此表达式,可以在 regex101.com 中修改或更改。

    正则表达式电路

    jex.im 也有助于将表达式可视化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-03
      • 1970-01-01
      • 1970-01-01
      • 2014-08-13
      • 2011-10-23
      • 2012-08-19
      相关资源
      最近更新 更多