Skip to main content
 首页 » 编程设计

c#之需要正则表达式的帮助来解析人类输入的时间

2024年01月29日29webabcd

我真的是 Regex 的新手并且正在努力工作,但在我看来这已经超出了简单的范围。我了解如何在 .Net 中创建 Regex 对象,但我不确定一旦有了模式,如何将它用于我的特定目的。

Regex regex = new Regex("(at ){0,1}[0-9]{1,2}(:[0-9]{2}){0,1}(?:[ap]m?){0,1}"); 

我需要能够接受“晚餐将在晚上 9 点在你最喜欢的餐厅”这样的句子并获取值 {“晚餐将在你最喜欢的餐厅”,“晚上 9 点 "}(删除“at”,如果它存在)。

完整(?)测试用例:

"Dinner at 9pm"            { "Dinner", "9pm" } 
"Dinner at9pm"             { "Dinner", "9pm" } 
"Dinner 9pm"               { "Dinner", "9pm" } 
"Dinner 9p"                { "Dinner", "9pm" } 
"Dinner 9a"                { "Dinner", "9am" } 
"Dinner 9pZ"               { "Dinner 9pZ", "" } 
"Dinner 9aZ"               { "Dinner 9aZ", "" } 
"Dinner at 9"              { "Dinner", "9" } 
"Dinner at 9:15pm"         { "Dinner", "9:15pm" } 
"Dinner at 9:15"           { "Dinner", "9:15" } 
"Dinner at9:15"            { "Dinner", "9:15" } 
"Dinner at 9pm in Seattle" { "Dinner in Seattle", "9pm" } 
"Dinner at9pmin Seattle"   { "Dinner in Seattle", "9pm" } 
"Dinner at9in Seattle"     { "Dinner in Seattle", "9" } 
"Dinner 9in Seattle"       { "Dinner 9in Seattle", "" } 
"9pm Dinner"               { "Dinner", "9pm" } 
"The 9pm Dinner was good"  { "The Dinner as good", "9pm" } 
"Dinner at 9pmpm"          { "Dinner pm" "9pm" } 
"Dinner at 9:15pmpm"       { "Dinner pm" "9:15pm" } 

(只是为了进一步说明,没有“:”或“am/pm”的数字必须以“at”开头,除非它是列出的第一个数字。“am”和“pm”需要以“结尾” M"或 "".)

除了测试用例之外,我不理解使用正则表达式对象(在上面的括号中列出)取回所需值所需的语法。

请您参考如下方法:

执行此操作的正则表达式会很复杂,而且在“晚上 9 点晚餐”等情况下也不会按预期顺序返回结果。如果你愿意花一点时间,写一个基本的 recursive-descent parser 可能会更简单。 .输入中的每个单词都会形成一个标记,您可以根据自己的要求轻松制定规则。例如:

event: "Dinner" time | 
       "Dinner" location | 
       "Dinner" time location | 
       "Dinner" location time 
 
time:  "at" number ":" number "am"/"pm" 
       /* etc. */ 

然后您为每个非终结符(事件、时间、位置等)编写一个小函数,该函数将完成其工作并返回结果。

如您所见,您的要求已经带来了如此多的可能性,以至于如果可能的话,正则表达式只会让它变得极其困惑。