使用不以某些字母开头的正则表达式捕获字符串(从某个点开始)

Capture a string (from a certain point) with regex not starting with certain letters

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

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

开头

en-GB 应该捕获 -GB

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

pt-BR 应该什么也抓不到。

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

-[^,]*

除了它还捕获以 pt 开头的字符串外,效果很好。

不幸的是,我不能使用 lookbehinds,因为它不受 JS 支持,所以我尝试使用像这样的负面前瞻:

^(?!pt).*

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

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

要匹配 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/, '')

参见 this regex demo。详情:

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