我最近不得不这样做,花了大约60秒写了一个C#程序来做,所以请不要告诉我有一个更简单的方法。我知道自从我完成它之后有一种更简单的方法。我只是想知道这是否可以完全用正则表达式完成。
我有一个字符串,其中包含一系列由分隔符分隔的元素。
分隔元素的数量始终是偶数。
我总是知道元素的总数。
我可以使用单个正则表达式替换模式(可以运行任意次数),以便交错Head和Tail元素吗?
实施例
8个元素
A, B, C, D, E, F, G, H
变为
A, H, B, G, C, F, D, E
编辑:
我得到了一些答案,其中包括动态构建模式。这是我想要避免的(几乎任何代码),但我责怪自己在我原来的问题中不够清楚。
我应该说
我希望能够编写一个我可以在notepad ++ regex替换中使用的模式,而无需打开另一个应用程序或编写任何代码
答案 0 :(得分:2)
这可以通过以下步骤在Notepad ++中完成:
用int index = Arrays.asList(PacketTypes.values()).indexOf(PacketTypes. LOCATION);
反复替换(\w+)((?:, \w+)*)(, \w+)
,直到找不到更多匹配项。
将所有$1!%!$3!%!$2
实例替换为< nothing>。
答案 1 :(得分:1)
是的,有点儿。匹配的正则表达式将是"([^,] +(?:,| $))+"但是替换字符串必须动态构建,如" $ 1 $ 8 $ 2 $ 7 $ 3 $ 6 $ 4 $ 5#34 ;.但是,如果您动态构建字符串"替换字符串",您可能只需拆分字符串并在该点手动连接。
答案 2 :(得分:1)
试试这个:
my $N = 8;
my $str = "A, B, C, D, E, F, G, H";
$str =~ s|((?:\w,?\s*){$N})|
my @items = split ',\s+', $1;
join ', ', map { $items[$_], $items[-($_+1)] } 0..($N/2 - 1)
|e;
为了适应您更新的问题:如何避免预设的$N
变量?你可以这样做:
$str =~ s|((?:\w,?\s*){8})|
my @items = split ',\s+', $1;
join ', ', map { $items[$_], $items[-($_+1)] } 0..3)
|e;
现在你必须将数字8和4-1硬编码到正则表达式中.. 那是你在找什么?
您可以通过这样做来避免输入数字3:
$str =~ s|((?:\w,?\s*){8})|
my @items = split ',\s+', $1;
my $N = scalar @items;
join ', ', map { $items[$_], $items[-($_+1)] } 0..($N/2 - 1)
|e;
现在你只需要硬编码8 ..