正则表达式用于交错列表的头部和尾部

时间:2017-04-20 20:16:14

标签: regex notepad++

我最近不得不这样做,花了大约60秒写了一个C#程序来做,所以请不要告诉我有一个更简单的方法。我知道自从我完成它之后有一种更简单的方法。我只是想知道这是否可以完全用正则表达式完成。

我有一个字符串,其中包含一系列由分隔符分隔的元素。

分隔元素的数量始终是偶数。

我总是知道元素的总数。

我可以使用单个正则表达式替换模式(可以运行任意次数),以便交错Head和Tail元素吗?

实施例

8个元素

A, B, C, D, E, F, G, H

变为

A, H, B, G, C, F, D, E

编辑:

我得到了一些答案,其中包括动态构建模式。这是我想要避免的(几乎任何代码),但我责怪自己在我原来的问题中不够清楚。

我应该说

我希望能够编写一个我可以在notepad ++ regex替换中使用的模式,而无需打开另一个应用程序或编写任何代码

3 个答案:

答案 0 :(得分:2)

这可以通过以下步骤在Notepad ++中完成:

  1. int index = Arrays.asList(PacketTypes.values()).indexOf(PacketTypes. LOCATION); 反复替换(\w+)((?:, \w+)*)(, \w+),直到找不到更多匹配项。

  2. 将所有$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 ..