我试图在正在构建的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 "")
我在做什么错?它在测试数据的最后一行根本不匹配。任何帮助都会很棒。
答案 0 :(得分:2)
尝试这个:
^(?<action>\S+)(?:\s(?<query>(?:(?! by ).)*))(?: by (?<id>\w+))?
id
始终以" by "
开头,因此您的<query>
组中的每个字符都应为该" by "
子字符串重复负向查找。
还要确保id
周围的组是可选的,以便第三行也可以匹配。
另一个选择,不是重复负向查找,而是对" by "
或字符串结尾进行一次正向查找,然后懒惰地重复:
^(?<action>\S+)(?:\s(?<query>.*?(?= by |$)))(?: by (?<id>\w+))?$