繁体   English   中英

RegEx 颠倒列表顺序?

[英]RegEx to reverse order of list?

是否有一个单一的正则表达式可以用在文本编辑器的搜索/替换对话框中来反转列表中项目的顺序?

例如,拿这个清单:

  • 第一项
  • 第二项
  • 第三项

在像 EditPad 这样的文本编辑器中选择它,调出搜索和替换框,应用正则表达式(运行或不循环运行)并将其转换为:

  • 第三项
  • 第二项
  • 第一项

这可以做到吗?

这不能通过正则表达式来完成。

我建议使用Perl之类的语言,您可以在其中使用正则表达式拆分列表并以相反的顺序写回。

在MSDOS中

SORT /R < originallist.txt > resortedlist.txt

仅当列表具有固定的已知项数n时,即使正则表达式也随着n增长而变得更加复杂。 (主要困难通常是让字面换行符进入引擎。)

使用脚本语言可以很容易地生成这一系列日益复杂的正则表达式。 但是,一旦使用脚本语言,几乎肯定可以更轻松地将其用于反转!

只是偶然发现了这个问题,因为我试图在 Google 表格中做同样的事情。

事实证明,只要知道列表的最大长度,就可以使用regexreplace函数使用正则表达式反转列表。 请注意,Sheets 可以获取一个正则表达式转换的输出并将其提供给另一个转换,这是关键,因为您需要嵌套它们的 O(log N)。 此外,如果正则表达式不匹配,则regexreplace输出等于输入,这也是它在最大长度的任何长度列表上工作的关键。 而且,您需要更改定界符,但如果您愿意,可以在最终包装器中将其改回。

例如,假设您有一个由逗号分隔的小写单词列表:“一、二、三、四、五”

然后,使用 Google Sheets regexreplace函数和 regex 语法(它使用 RE2 regex,所以这应该(?)翻译成大多数语言),下面将执行此操作(添加缩进以提高可读性):

=regexreplace(
    regexreplace(
        regexreplace(A1,"([a-z\|]+),([a-z\|]+)","$2|$1"),
    "([a-z\|]+),([a-z\|]+)","$2|$1"),
"([a-z\|]+),([a-z\|]+)","$2|$1")

输出将是:“五|四|三|二|一”。 请注意包含新的分隔符“|” 在正则表达式中,这是关键。 此表达式最多适用于列表中的 8 个元素。 添加另一个“regexreplace”,它最多适用于 16 个,等等。

我意识到自问这个问题已经有一段时间了...但是这个答案不在这里。

根据您在文本编辑器中格式化列表的方式,可以按照以下步骤进行操作:

原文:“快棕色狐狸”

查找:(\\ w +)\\ s(\\ w +)\\ s(\\ w +)\\ s(\\ w +)

更换:$ 4 $ 3 $ 2 $ 1

输出:“ Fox Brown Quick The”(在notepad ++上运行,只需确保选择“正则表达式”选项)

相当于javascript:

        var string = "The Quick Brown Fox";
        string.replace(/(\w+)\s(\w+)\s(\w+)\s(\w+)/,"$4 $3 $2 $1");

很好的参考是https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions

从技术上讲不是正则表达式,但是有一个sed单行代码可以反转输入行( source ):

sed '1!G;h;$!d'

vi命令来反转当前文件( )的行:

:g/.*/m0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM