我想每行交换两次比赛。
例如,在下面的示例中,我想将PAG30079XZ
与2213
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
答案 0 :(得分:1)
我想,您的任务比较笼统,不仅限于单行和一对 字符串。
您实际上想交换每行的第二和第四个“段”,
在源数据中第2行的情况下,/
个字符之间,
PAG30079XZ
和2213
。
如果我是对的,请为每个段使用捕获组,并在它们之间使用/
。
从您的数据可以看出,所有细分均包含字母和数字,
因此,为简单起见,每个组可以是\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")
我正在捕获/
个字符之间的“内容”(在某些情况下,只是坚持使用硬编码的“ ESB”,因为我假设这是一个恒定的“锚”,但是您没有说),然后将它们重新排列在结果中。
但是,您可能会发现使用str.split('/')
简单地标记字符串,然后重新排列结果数组的元素(如果您认为合适)会更加简单。这里的正则表达式似乎没有强大的用例。