正则表达式通过使用输入字符串

时间:2017-01-30 02:29:09

标签: javascript regex

我知道为什么会出现这个问题,但我需要一种方法来解决它。考虑我有一个字符串:

var str = "123+53ff+124+ks23+223+22+mo";

我希望用+替换两个number符号之间的数字来获取此信息:

str = "123+53ff+number+ks23+number+number+mo";

所以我使用这个正则表达式:/\+\d+\+/g,如下所示:

str = str.replace(/\+\d+\+/g, "+number+");

但它的作用是如果彼此之后有更多匹配(+3+4+5+...),它匹配一个,跳过下一个,匹配后一个,跳过后一个......

我知道为什么会发生这种情况:这是因为当它匹配一个时,它会消耗正确的+,然后在+之后开始匹配,其中下一个元素将不匹配因为从技术上来说它并没有被+标志所包围。

如果输入是+3++4++5+,那么结果就像预期的那样,因为每个数字都被它自己的+符号包围(因为如果一个+replace,那么消费一个不是问题消耗下一个会做的)。

我通过两次调用+来解决这个问题。但这非常hacky。我想要一个坚实的方式。那么,如何使正则表达式在这里工作?或者如何使两个连续的数字共享相同的+符号?

注意:我不想解决此特定示例的问题(替换+符号之间的数字)。这只是问题的一个例子。

修改

如果有办法,那么我可以将/(\+).../标志分组吗?我的意思是我可以执行此操作$1,以便我可以使用libraryDependencies ++= Seq( "com.typesafe.play" %% "play-slick" % "2.0.0", "com.typesafe.play" %% "play-slick-evolutions" % "2.0.0" ) 访问它吗?

2 个答案:

答案 0 :(得分:4)

正则表达式仅查找非重叠匹配。找到匹配后,将从匹配结束继续搜索。您可以使用外观断言来添加上下文而不添加到匹配本身:

/(?<=\+)\d+(?=\+)/

(?<=\+)声称在当前位置之前有一个加号; (?=\+)声称在当前位置之后有一个加号。它们都是零宽度。

编辑:JavaScript没有lookbehind,所以/\+\d(?=\+)/就是你在这种情况下可以做的。

EDIT2:外观断言不会自行捕获。您无法将前瞻与匹配组合在一起。但是,您可以单独对其进行分组,然后再连接:

/(\+)(\d+)(?=(\+))/

会给你这三件作品。

答案 1 :(得分:4)

由于重叠匹配不匹配,您可以使用正向前瞻以确定数字后面是否有+个字符。

这样做,你实际上并没有匹配后续的+,因为它是前瞻的一部分:

Example Here

/\+\d+(?=\+)/g

例如:

"123+53ff+124+ks23+223+22+mo".replace(/\+\d+(?=\+)/g, "+number");

输出:

"123+53ff+number+ks23+number+number+mo"

值得指出的是,您现在可以使用+number(而不是+number+)替换匹配,因为后续的+不再匹配。

注意:如果您想对+个符号进行分组,请将第一个符号分组为:/(\+)\d+(?=\+)/g,因为第一个就足够了。第二个将在下一场比赛中自动分组。