【问题标题】:Capture a string (from a certain point) with regex not starting with certain letters使用不以某些字母开头的正则表达式捕获字符串(从某个点开始)
【发布时间】:2020-05-01 14:14:13
【问题描述】:

我正在编写一个正则表达式,如果字符串不是以某些字母开头,它会从某个点捕获所有内容。

更准确地说,我想捕获从 - 到逗号的所有内容,前提是该字符串不以 pt 开头。

zh-CN 应该捕获-GB

但如果单词以pt 开头,我只想跳过捕获:

pt-BR 应该什么都不捕获。

我创建了这个正则表达式:

-[^,]*

这很好用,除了它还捕获以pt 开头的字符串。

不幸的是我不能使用lookbehinds,因为它不受JS支持,所以我尝试使用这样的否定lookahead:

^(?!pt).*

问题是这会捕获整个字符串,而不是来自-。我尝试用在-开始捕获的东西替换.*,但到目前为止我还没有成功。

我对正则表达式有点陌生,所以任何指导都会有所帮助。

【问题讨论】:

  • 你只想要s.match(/^(?!pt)[A-Za-z]{2}(-[^,]+)/)[1]吗?
  • 问题在于它匹配整个字符串。我只想匹配从 - 及以后的所有内容
  • 但是您可能只返回捕获的文本,这不是问题,因为您可以访问代码。还是你?
  • 我愿意,但理想情况下我应该只替换每个出现,而不是对每个捕获的文本进行字符串操作。你知道是否有办法实现这一目标?
  • 很难得到你想要的,因为我还是不明白你的最终结果应该是什么样子。你匹配什么并不重要,更重要的是你捕获了什么以及你稍后在代码中做什么。好的,让我们想象一下你有en-GB 字符串。您需要得到的最终结果是什么?一个字符串en?你需要用.replace来做吗?试试text.replace(/\b(?!pt-)([A-Za-z]{2})-[a-zA-Z]{2}\b/, '$1')

标签: javascript regex regex-lookarounds


【解决方案1】:

要匹配pt- 和字符串开头的任意两个字母或任意两个其他字母,您可以使用

text.match(/^(?:pt-[a-zA-Z]{2}|[a-zA-Z]{2})/)

请参阅regex demo。详情:

  • ^ - 字符串开头
  • (?:pt-[a-zA-Z]{2}|[a-zA-Z]{2}) - 两种选择之一:
    • pt-[a-zA-Z]{2} - pt- 和任意两个 ASCII 字母
    • | - 或
    • [a-zA-Z]{2} - 任意两个 ASCII 字母

您似乎出于某种原因需要使用.replace 方法。然后,您可以使用

text.replace(/\b(?!pt-)([A-Za-z]{2})-[a-zA-Z]{2}\b/, '$1')

this regex demo。详情:

  • \b - 单词边界
  • (?!pt-) - 不允许 pt- 紧邻当前位置
  • ([A-Za-z]{2}) - 第 1 组:任意两个 ASCII 字母
  • - - 一个连字符
  • [a-zA-Z]{2} - 任意两个 ASCII 字母
  • \b - 单词边界

【讨论】:

    猜你喜欢
    • 2015-12-11
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多