【问题标题】:Regex: Match every character between two strings正则表达式:匹配两个字符串之间的每个字符
【发布时间】:2021-09-14 00:12:52
【问题描述】:

我正在尝试找到一种方法来匹配两个字符串之间的每个字符。

例如,对于给定的字符串abc--def--ghi,我希望正则表达式匹配def

我尝试使用以下正则表达式 (?<=--)(.*)(?=--),但是这匹配 所有 -- (def) 之间的字符,而我需要匹配 每个 -- 之间的字符。

s.match(/--(.*?)--/)[1].split("") 不起作用,因为我需要这样做而不拆分。

有什么建议吗?

【问题讨论】:

  • 编程语言是什么?另外,如果你有abc--def--ghi--jkl,预期的结果是什么?
  • 是否可以先匹配所有个字符,然后再拆分结果组?
  • 也许是(.)* 而不是(.*)
  • @WiktorStribiżew 这是 Javascript
  • @CherryDT 在特定场景中,我需要将正则表达式传递给一个函数,该函数将正则表达式匹配替换为其他内容。要求是传递一个正则表达式,以便替换每个字符。这就是为什么不能使用 split 的原因。

标签: javascript regex


【解决方案1】:

在 JavaScript 中,使用兼容 ECMAScript 2018+ 的正则表达式引擎,您无需额外的拆分步骤即可实现您想要的目标

/(?<=--(?:(?!--).)*).(?=(?:(?!--).)*--)/gs
/(?<=--[^-]*(?:-(?!-)[^-]*)*).(?=[^-]*(?:-(?!-)[^-]*)*--)/gs

参见regex demosecond variant 与第一个正则表达式相同,但更有效,因为它遵循“展开循环”原则)。 详情

  • (?&lt;=--(?:(?!--).)*) - 紧跟在-- 前面的位置,然后是任何一个或多个(尽可能多)字符,每个字符都不以-- 字符序列开头
  • . - 任何单个字符
  • (?=(?:(?!--).)*--) - 紧随其后的是任何一个或多个(尽可能多的)字符,每个字符都不以-- 字符序列开头,然后是--

s 标志使. 能够匹配任何字符,包括. 默认不匹配的换行字符。

【讨论】:

  • 谢谢,这行得通。你能解释一下为什么你(在你的其他一个 cmets 中)说这个解决方案不是一个好主意吗?
  • @yankolo 使用这个正则表达式的回溯步数比使用简单的--(.*?)-- 大得多。我添加了一个更高效的版本,但是作为正则表达式模式中的第一个构造的未锚定的lookbehind 在计算上仍然很昂贵。
  • 说到性能,差多少?
  • @yankolo 那应该在目标环境中检查。
猜你喜欢
  • 1970-01-01
  • 2012-09-26
  • 1970-01-01
  • 1970-01-01
  • 2011-08-31
  • 1970-01-01
相关资源
最近更新 更多