【问题标题】:regex match exclude bracket's string正则表达式匹配排除括号的字符串
【发布时间】:2023-03-04 19:08:02
【问题描述】:

我有以下字符串,想匹配不在括号“()”中的字符串。

我已经尝试了以下,但它与括号匹配,我想要它的逆。

var str = '45.6 fl oz (456 g)';
console.log(str.match(/[\(]+[^\)]*\)/g));

谁能帮帮我?我想关注输出:-

45.6 fl oz
(456 g)

【问题讨论】:

  • character set ([...]) 内,括号没有任何特殊含义,无需转义。 [\(][(] 相同,与\( 相同(字符集外的括号需要转义)。
  • 看来你需要进一步的帮助来解析这个字符串。请发表评论而不是问另一个问题。看,4.5 fl oz 可以拆分为数字/非数字,就像我在回答中建议的那样:str.split(/\s*(\d*\.?\d+)\s*/).filter(Boolean)。但是如果你也需要fl,可能你需要指定一个非捕获组内的所有选项,比如str.split(/\s*(\d*\.?\d+\s*(?:fl oz|[kmd]?g|l))\s*/).filter(Boolean)...

标签: javascript regex match


【解决方案1】:

您需要从本质上捕获两个组;一个,针对不在() 中的文本,另一个针对() 中的文本:

var str = '45.6 fl oz (456 g)';
console.log(str.match(/([^()])+|(\(.*\))/g).map(item => item.trim()));

【讨论】:

  • 我已经尝试了 '45.6 fl oz (456 g) (2.6 cup)' 并且它给出了以下输出 [ "45.6 fl oz", "(456 g) (2.6 cup)" ]
【解决方案2】:

你可以和/\s*(\([^()]*\))/分开:

var str = '45.6 fl oz (456 g)';
console.log(str.split(/\s*(\([^()]*\))/).filter(Boolean));
//Or, split with whitespaces before a (:
console.log(str.split(/\s*(?=\()/));

模式匹配

  • \s* - 0+ 个空格字符
  • (\([^()]*\)) - 捕获组 #1(其值将成为结果数组的一部分):
    • \( - 一个(
    • [^()]* - 除 () 之外的任何 0+ 个字符
    • \) - 一个)

要在结果中排​​除(),请调整捕获组边界:/\s*\(([^()]*)\)/

.filter(Boolean) 将删除在字符串开头/结尾找到匹配项时出现的冗余前导/尾随空数组项。

第二个变体 /\s*(?=\()/ 仅匹配 0+ 个空格字符,这些字符紧跟在 ( 字符后(感谢 (?=\() 前瞻)。

【讨论】:

    猜你喜欢
    • 2017-09-15
    • 2019-01-05
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多