3

我正在尝试|""第一次和最后一次替换。

例子:

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

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

第一次出现:

^(.*?)[|]

最后出现:

(|)[^|]*$"

是否可以同时更换两者,还是必须分步更换?

4

4 回答 4

3

尝试这个

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

并将其替换为

$1"

在 Regexr 上查看

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

于 2012-11-22T10:27:05.503 回答
1

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

你会得到第一个也是最后一个 | 在比赛组

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

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

于 2012-11-22T10:22:20.973 回答
1

将字符串想象为由以下部分组成:第一个管道之前的部分、管道、中间部分、管道和最后一个管道之后的部分。

捕捉你想要的部分:([^|]*)[|](.*)[|](.*)

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

于 2012-11-24T01:35:08.117 回答
0

其他一些答案应该有效,但我相信它们可能稍微过度设计。下面的简单正则表达式应该可以工作。

\|(.*)\|

演示

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

var str = "Hello | my name | is | Jason | and I like hacking";
var regex = /\|(.*)\|/;
str = str.replace(regex, "\"$1\"");
于 2019-03-01T21:08:22.490 回答