使用正则表达式分隔所需数据时遇到问题

时间:2018-07-31 03:48:41

标签: regex

我试图在正在构建的Rails应用程序上使用正则表达式来分隔输入,而无需手动拆分字符串。

我的正则表达式是:

(?<action>\S+)(?:\s(?<query>.*)\s)(?<id>(?<=.).*?(?=\s))

我正在使用的测试数据如下:

add hello by name
remove first second by id
add first

由此,我需要以下值:

action: add, query: hello, id: name
action: remove, query: first second, id: id
action: add, query: first, id: nil (or "")

我在做什么错?它在测试数据的最后一行根本不匹配。任何帮助都会很棒。

1 个答案:

答案 0 :(得分:2)

尝试这个:

^(?<action>\S+)(?:\s(?<query>(?:(?! by ).)*))(?: by (?<id>\w+))?

id始终以" by "开头,因此您的<query>组中的每个字符都应为该" by "子字符串重复负向查找。

还要确保id周围的组是可选的,以便第三行也可以匹配。

Demo

另一个选择,不是重复负向查找,而是对" by "或字符串结尾进行一次正向查找,然后懒惰地重复:

^(?<action>\S+)(?:\s(?<query>.*?(?= by |$)))(?: by (?<id>\w+))?$