用于从字符串中挑选参数的正则表达式

时间:2011-12-13 16:25:29

标签: .net regex

自从我做了任何严肃的正则表达以来已经有一段时间了,而且我花了很多时间去做一些非常简单的事情。

这很简单,因为我正在界定行动和论点。

我只需要四个命名的捕获组,即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”的捕获字符串的其余部分。

我还没有发布我所得到的东西,因为它是一团糟。我想要做的事情并不复杂,任何人都可以给我一些指示。

谢谢,

萨姆

1 个答案:

答案 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