Regex 正则表达式用于交错列表的开头和结尾

Regex 正则表达式用于交错列表的开头和结尾,regex,notepad++,Regex,Notepad++,我最近不得不这么做,花了大约60秒的时间编写了一个C#程序,所以请不要告诉我有更简单的方法。我知道有一个更简单的方法,因为我已经做到了。我只是想知道这是否可以用正则表达式来完成 我有一个字符串,它包含由分隔符分隔的一系列元素 分隔元素的数量始终为偶数 我总是知道元素的总数 我可以使用一个regex替换模式(可以运行任意次数)来交错Head和Tail元素吗 范例 8要素 A, B, C, D, E, F, G, H 变成 A, H, B, G, C, F, D, E 编辑: 我得到了一些答案,

我最近不得不这么做,花了大约60秒的时间编写了一个C#程序,所以请不要告诉我有更简单的方法。我知道有一个更简单的方法,因为我已经做到了。我只是想知道这是否可以用正则表达式来完成

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

分隔元素的数量始终为偶数

我总是知道元素的总数

我可以使用一个regex替换模式(可以运行任意次数)来交错Head和Tail元素吗

范例

8要素

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

A, H, B, G, C, F, D, E
编辑:

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

我应该说


我希望能够编写一种模式,在notepad++regex-replace中使用,而无需打开另一个应用程序或编写任何代码。匹配的正则表达式将是“([^,]+(?:,|$)+”,但是替换字符串必须动态构建为“$1$8$2$7$3$6$4$5”。但是,如果您动态构建字符串“replace string”,那么您也可以拆分该字符串,然后在该点手动合并。

是的,有点像。匹配的正则表达式将是“([^,]+(?:,|$)+”,但是替换字符串必须动态构建为“$1$8$2$7$3$6$4$5”。但是,如果您动态生成字符串“replace string”,那么您也可以拆分该字符串,然后在该点手动合并。

尝试以下操作:

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进行硬编码即可。

尝试以下方法:

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进行硬编码。

这可以通过以下步骤在记事本++中完成:

  • 重复将
    (\w+)(?:,\w+*)(,\w+)
    替换为
    $1$3!%!$2
    直到找不到更多匹配项

  • 替换
    !%的所有实例使用


  • 这可以通过以下步骤在记事本++中完成:

  • 重复将
    (\w+)(?:,\w+*)(,\w+)
    替换为
    $1$3!%!$2
    直到找不到更多匹配项

  • 替换
    !%的所有实例使用


  • 只花了60秒?现在退出不是有点太早了吗?然而,这并不是只用正则表达式就可以做到的。字符串中的元素是逗号分隔的吗?为什么不把它们放在一个数组中呢?60秒是写一个循环,以另一种方式完成,而不是正则表达式。我这么说是为了让人们不要告诉我把字符串拆分成几个数组,然后只花60秒就在它们之间循环?现在退出不是有点太早了吗?然而,这并不是只用正则表达式就可以做到的。字符串中的元素是逗号分隔的吗?为什么不把它们放在一个数组中呢?60秒是写一个循环,以另一种方式完成,而不是正则表达式。我只是这么说,这样人们就不会告诉我把字符串分成几个数组,然后在它们之间循环。是的,我觉得情况就是这样。我试图避免任何动态模式生成。我的想法是,我希望能够编写一个模式,我可以在notepad++regex-replace中使用,而无需打开另一个应用程序或编写任何代码。我知道这不是一个正确的方法,只是一种思维实验。是的,我想情况就是这样。我试图避免任何动态模式生成。我的想法是,我希望能够编写一个模式,我可以在notepad++regex-replace中使用,而无需打开另一个应用程序或编写任何代码。我知道这不是正确的方法,只是一种思维实验。对计数进行硬编码对我很有效。我想这是我将要得到的最接近的结果,并确认了我需要某种非正则表达式指令来实现这一点。对计数进行硬编码对我很有用。我想这是我将要得到的最接近的结果,并确认我需要某种非正则表达式指令来完成这项工作。宾果!这真是太棒了!这就成功了