假设我有一个这样的字符串:abc def ghi jkl
(为了简单起见,我在最后添加了一个空格,但它对我来说并不重要)我希望捕获它的#34 ;块"如下:
abc
def
ghi
jkl
当且仅当有1-4"块"在字符串中。我已经尝试了以下正则表达式:
^([^ ]+ ){1,4}$
在Regex101.com但它只捕获最后一次出现。发出警告:
重复捕获组仅捕获最后一次迭代。如果您对数据不感兴趣,请在重复组周围放置捕获组以捕获所有迭代或使用非捕获组
如何纠正正则表达式以实现我的目标?
答案 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个或多个字符