使用正则表达式

时间:2016-11-14 09:35:53

标签: regex tokenize pcre

假设我有一个这样的字符串:abc def ghi jkl(为了简单起见,我在最后添加了一个空格,但它对我来说并不重要)我希望捕获它的#34 ;块"如下:

abc

def

ghi

jkl

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

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

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

  

重复捕获组仅捕获最后一次迭代。如果您对数据不感兴趣,请在重复组周围放置捕获组以捕获所有迭代或使用非捕获组

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

2 个答案:

答案 0 :(得分:0)

可以使用tr:

在linux上完成
tr -sc 'a-zA-Z' '\n' < text.txt > out_text.txt

text.txt文件中的字符串是要规范化的字符串。

答案 1 :(得分:0)

由于您无法访问代码,因此您可能使用的唯一解决方案是基于\G运算符的正则表达式,该运算符仅允许连续匹配并且在开始时锚定前瞻,需要1到4个非字符串中的-whitespace块。

(?:^(?=\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个或多个字符