regex 获取有效负载中存在的两个管道之间的数据[duplicate]

plicqrtu  于 2022-11-18  发布在  其他
关注(0)|答案(1)|浏览(129)

此问题在此处已有答案

regex to match substring after nth occurence of pipe character(3个答案)
去年关闭了。
我最近开始学习ruby中的正则表达式,我想从有效负载中提取特定的数据。我的有效负载看起来像这样:
2021年2月1日16:06:06.703中文中文版中文版中文版中文版中文版中文版中文版中文版中文版中文版中文版中文版中文版中文版中文版中文版中文版中文版中文版中文版中文版中文版中文版中文版中文版中文版中文版中文版中文版中文版中文版中文版中文版中文版中文版中文版|ABCD型|范例文字|数量|样本随机文本|此值是随机的,我想从有效负载中取出此值| 9|剩余有效载荷
由于我的数据存在于管道(||),我写了这个正则表达式:

(?<=\|)[^|]++(?=\|)

但问题是,这个正则表达式取|之间的所有值 | .
有人能帮我提取第5|第6|之间的值吗?

im9ewurl

im9ewurl1#

您希望提取第5和第6管道之间的文本。您可以使用以下正则表达式来完成此操作。
第一个
我们可以用 * 自由空格模式 * 来编写正则表达式,使其具有自文档性。自由空格模式会导致Ruby的正则表达式引擎在解析表达式之前删除所有注解和空格(这意味着需要对任何空格进行保护,方法是转义它们,将它们放在字符类中,等等)。

/
\A       # match beginning of the sting
(?:      # begin a non-capture group
  [^|]*  # match any character other than a pipe zero or more times
  \|     # match a pipe
){5}     # end non-capture group and execute it 5 times
\K       # discard all previous matches and reset the start of the
         # match to the current location
[^|]*    # match any character other than a pipe zero or more times
(?=      # begin a positive lookahead to assert that the next
         # character is a pipe
  \|     # match a pipe
)
/x       # invoke free-spacing mode

另一种方法是删除\K并添加捕获组:

str[/\A(?:[^|]*\|){5}([^|]*)(?=\|)/, 1]
  #=> "My dog has fleas"

当然,您不需要为此使用正则表达式:

str.count('|') > 5 && str.split('|')[5]
  #=> "My dog has fleas"

相关问题