regex Javascript匹配任何内容,直到模式

mu0hgdu0  于 2023-03-09  发布在  Java
关注(0)|答案(4)|浏览(113)

给定example-123,我只需要提取example。同样,example可以是:example-example-345,在这种情况下,我需要example-example。这就是我要寻找的模式:

> str.match('-[0-9]{1,}$')[0]
'-123'

我试过:

str.match(/(.*)-[0-9]{1,}$/)
'example-123'

以及

str.match(/(?s).*)-[0-9]{1,}$/)[0]
Uncaught SyntaxError: Invalid regular expression: /(?s).*)-[0-9]{1,}$/: Invalid group

以及

str.match('[^-[0-9]{1,}$]')
null

以及

str.match('(.*)[^-[0-9]{1,}$]')
null

以及

str.match('/.*/[^-[0-9]{1,}$]')
null

以及

str.match('.*^(-[0-9]{1,}$)')
null

......名单还在继续

1bqhqjot

1bqhqjot1#

试试这个:

str.match(/^(.+)-\d+$/)[1]
    • 匹配所有内容直到连字符后面跟着数字!**

而且有了[1]它只会得到第一部分!

lmyy7pcs

lmyy7pcs2#

您可以使用positive lookahead来实现这一点:

let str = 'example-example-123';
console.log(str.match(/.+(?=-123)/)[0]);

str = "example-123";
console.log(str.match(/.+(?=-123)/)[0]);

str = "example-example-example-123-something-after";
console.log(str.match(/.+(?=-123)/)[0]);
14ifxucb

14ifxucb3#

您可以使用*?在零到无限次之间匹配前一个令牌,尽可能少的次数,根据需要扩展(懒惰匹配,非贪婪匹配)

const str = 'example-example-123';

console.log(str.match(/(.*?)-\d/)[1]);
nhjlsmyf

nhjlsmyf4#

您可以匹配正则表达式

^([a-z]+)(?:-\1)*(?=-)

Demo
我假设第一个连字符前面的单词必须只包含小写字母。当然,这个假设可能是错误的,在这种情况下,([a-z]+)必须相应地改变。例如,要匹配一个字母后面跟着零个或多个字母和数字,它将是([a-zA-Z][a-zA-Z0-9]*)
如链接所示,下面由党的帽子指示的文本是匹配的。

example-123
^^^^^^^

example-example-345
^^^^^^^^^^^^^^^

dog-dog-dog-123
^^^^^^^^^^^

dog-dog-cat-123
^^^^^^^

dog-cat-cat 123
^^^^^^^^^^^

dog-dog123
^^^

dog

在最后一个示例中没有匹配项。
正则表达式可以分解如下。

^         Match beginning of the string
(         Begin capture group 1
  [a-z]+  Match one or more lowercase letters
)         End capture group 1
(?:       Begin non-capture group
  -\1     Match a hyphen followed by the contents of capture group 1
)*        End the non-capture group and execute it zero or more times
(?=       Begin a positive lookahead
  -       Match a hyphen
)         End the positive lookahead

请注意,正向前瞻(?=-)强制匹配后面跟一个连字符,但该连字符不是返回的匹配的一部分。

相关问题