代码之家  ›  专栏  ›  技术社区  ›  user7155973

用正则表达式标记字符串

  •  1
  • user7155973  · 技术社区  · 9 年前

    假设我有一个这样的字符串: abc def ghi jkl (为了简单起见,我在结尾放了一个空格,但这对我来说并不重要),我想捕捉它的“块”,如下所示:

    abc
    
    def
    
    ghi
    
    jkl
    

    当且仅当字符串中有1-4个“块”。我已经尝试了以下正则表达式:

    ^([^ ]+ ){1,4}$
    

    在Regex101.com,但它只捕获最后一次出现。发出警告:

    如何更正正则表达式以实现我的目标?

    2 回复  |  直到 9 年前
        1
  •  0
  •   Wiktor Stribiżew    9 年前

    \G 运算符,该运算符将只允许连续匹配,并在字符串中需要1到4个非空白块的开头锚定先行。

    (?:^(?=\s*\S+(?:\s+\S+){0,3}\s*$)|\G(?!^))\s*\K\S+
    

    regex demo

    :

    • (?:^(?=\s*\S+(?:\s+\S+){0,3}\s*$)|\G(?!^)) -用于检查以下情况的自定义边界:

      • ^(?=\s*\S+(?:\s+\S+){0,3}\s*$) -字符串起始位置( ^ )然后是1到4个非空白块,以1+空白分隔,也允许尾随/前导空白
      • | -或
      • \G(?!^) \G 也匹配字符串的开头,因此我们必须使用负前瞻排除匹配位置,因为执行了单独的检查)
    • \s*

    • \K -一个匹配重置运算符,丢弃迄今为止匹配的所有文本
    • \S+ -除空白以外的1个或多个字符
        2
  •  0
  •   user6713148 user6713148    9 年前

    可以使用tr在linux上完成:

    tr -sc 'a-zA-Z' '\n' < text.txt > out_text.txt
    

    其中在文本中。txt文件是要规范化的字符串。