是否有可能在首次出现和最后出现的char时进行正则表达式替换?

时间:2012-11-22 10:16:30

标签: regex

我想在第一次和最后一次出现时用|替换""

示例:

"Hello | my name | is | Jason | and I like hacking"

到目前为止,我只能做其中一个。

第一次出现:

^(.*?)[|]

最后一次出现:

(|)[^|]*$"

是否可以一次更换两者,还是必须分步更换?

4 个答案:

答案 0 :(得分:3)

试试这个

^([^|]*)\||\|(?=[^|]*$)

并将其替换为

$1"

here on Regexr

这里的技巧是将字符串中的第一部分与捕获组匹配,并将其写入替换字符串中。对于匹配最后一个“|”的第二个替代方案没有捕获组,所以这将填充空字符串,并且在替换字符串中不会受到伤害。

答案 1 :(得分:1)

我认为这可以解决问题:(?:^[^|]*(\|))|(?:(\|)[^|]*$)

你会得到第一个和最后一个|在比赛组中

如果您使用支持可变长度lookbehind的RegEx引擎,我认为这样可行:(?<=^[^|]*)\||\|(?=[^|]*$)

您只会匹配第一个和最后一个|

答案 2 :(得分:1)

将字符串视为由这些部分组成:第一个管道之前的部分,管道,中间部分,管道以及最后一个管道之后的部分。

捕获您想要的部分:([^|]*)[|](.*)[|](.*)

然后从捕获的部分构建结果:$1$2$3

答案 3 :(得分:0)

其他答案中的一些应该起作用,但是我相信它们可能在设计上有些过分。下面的简单正则表达式应该可以使用。

\|(.*)\|

Demo

此正则表达式之所以有效,是因为.*不是贪婪的,它会根据需要返回以匹配模式。在这种情况下,这意味着捕获组将捕获第一个和最后一个管道之间的所有内容。然后,您可以使用所需的任何字符替换管道。下面的Javascript示例。

var str = "Hello | my name | is | Jason | and I like hacking";
var regex = /\|(.*)\|/;
str = str.replace(regex, "\"$1\"");