自从我做了任何严肃的正则表达以来已经有一段时间了,而且我花了很多时间去做一些非常简单的事情。
这很简单,因为我正在界定行动和论点。
我只需要四个命名的捕获组,即ACTION,FROM,TO或FOUR。
我只需要从字符串中提取参数,这些是我想要匹配的字符串的一些示例。
输入字符串:从今天到明天的某些操作
捕获:( ACTION = someaction,FROM ='今天',UNTIL ='明天',FOR = null)
输入字符串:现在某事件+ 3至12/12
捕获:( ACTION = someaction,FROM ='now + 3',UNTIL = '12 / 12',FOR = null)
输入字符串:明天的某些行为,持续2天
捕获:( ACTION = someaction,FROM ='明天',UNTIL = null,FOR ='2天')
输入字符串:今天的某些行动持续6小时
捕获:( ACTION = someaction,FROM ='今天',UNTIL = null,FOR ='6小时')
ACTION将始终是第一个以空格分隔的字符串。我的例子中的'某些行为'。 接下来将是单词“from”或“from”的值,由“until”或“for”分隔。 然后将始终遵循“直到”或“为”的字样。 最后,命名为“until”或“for”的捕获字符串的其余部分。
我还没有发布我所得到的东西,因为它是一团糟。我想要做的事情并不复杂,任何人都可以给我一些指示。
谢谢,
萨姆
答案 0 :(得分:1)
由于您没有说出您正在使用的语言,因此这是一个执行此任务的perl脚本:
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dump qw(dump);
while(<DATA>) {
my @capt = $_ =~ /^(\S+)\s+(?:from\s+)?(.*?)\s+(?:until\s+(.*$)|for\s+(.*$))/;
dump @capt;
}
__DATA__
someaction from today until tomorrow
someaction now + 3 until 12/12
someaction from tomorrow for 2 days
someaction today for 6 hours
<强>输出:强>
("someaction", "today", "tomorrow", undef)
("someaction", "now + 3", "12/12", undef)
("someaction", "tomorrow", undef, "2 days")
("someaction", "today", undef, "6 hours")
它应该很容易转换成另一种语言。
<强>解释强>
/ : regex delimiter
^ : start of the string
(\S+) : first capture: 1 or more non space char
\s+ : 1 or more spaces
(?:from\s+)? : is there from litteral
(.*?) : second capture: any number of any char not greedy
\s+ : some spaces
(?: : non cature group
until\s+ : until + spaces
(.*$) : third capture group: everything until the end
| : OR
for\s+ : for + spaces
(.*$) : fourth capture group: everything until the end
) : end of non capture group
/ : regex delimiter