我无法与捕获小组进行比赛

时间:2018-12-04 13:57:42

标签: javascript regex

我想每行交换两次比赛。 例如,在下面的示例中,我想将PAG30079XZ2213

交换
AL/PAG31503XZ/ESB/2351/ESB/ABCD/
AR/PAG30079XZ/ESB/2213/ESB/ABCD
BL/PMC16410R7/ESB/1798/ESB/ABCD/
BR/PMC27936XZ/ESB/2444/ESB/ABCD
CL/PMC27377XZ/ESB/2563/ESB/ABCD/ 

我希望将所需的值放在捕获组中可以解决问题,但这不起作用。

所以我尝试了以下操作:

/(PAG30079XZ)(2213)/g

交换部分将是

$1$2

Regex101 example

2 个答案:

答案 0 :(得分:1)

我想,您的任务比较笼统,不仅限于单行和一对 字符串。

您实际上想交换每行的第二第四个“段”, 在源数据中第2行的情况下,/个字符之间, PAG30079XZ2213

如果我是对的,请为每个段使用捕获组,并在它们之间使用/。 从您的数据可以看出,所有细分均包含字母和数字, 因此,为简单起见,每个组可以是\w+( 字字符)。 \w实际上也与_相匹配,但是我认为这没关系。

例外是第4段,仅包含数字,因此该组可以是 \d+

因此整个正则表达式应为:

^(\w+)\/(\w+)\/(\w+)\/(\d+)

(注释^-行锚的开始和/的引号)和替换 字符串应为:

$1/$4/$3/$2

(请注意,将$2$4互换)。

您还应该使用g选项执行全局替换并 m匹配行首^

有关工作示例,请参见https://regex101.com/r/D3K837/1

答案 1 :(得分:0)

如果您提供的模式实际上与输入匹配,则可以使用正则表达式来实现。

稍微推断您的要求(未指定):

str.replace(/^([^\/]+)\/([^\/]+)\/ESB\/([^\/]+)\/ESB\/([^\/]+\/?)$/, "$1/$3/ESB/$2/ESB/$4")

live demo

我正在捕获/个字符之间的“内容”(在某些情况下,只是坚持使用硬编码的“ ESB”,因为我假设这是一个恒定的“锚”,但是您没有说),然后将它们重新排列在结果中。

但是,您可能会发现使用str.split('/')简单地标记字符串,然后重新排列结果数组的元素(如果您认为合适)会更加简单。这里的正则表达式似乎没有强大的用例。