2017-02-26 66 views
2

我構建了RiveScript的chatbot子集,並嘗試使用正則表達式構建模式匹配解析器。哪三個正則表達式匹配以下三個示例?用替代方案和可選方案解析正則表達式

ex1: I am * years old 
valid match: 
- "I am 24 years old" 
invalid match: 
- "I am years old" 

ex2: what color is [my|your|his|her] (bright red|blue|green|lemon chiffon) * 
valid matches: 
- "what color is lemon chiffon car" 
- "what color is my some random text till the end of string" 

ex3: [*] told me to say * 
valid matches: 
- "Bob and Alice told me to say hallelujah" 
- "told me to say by nobody" 

通配符表示任何不爲空的文本都是可以接受的。

在示例2中,[ ]之間的任何內容都是可選的,()之間的任何內容都是可選的,每個選項或替代項之間用|分隔。

在示例3中,[*]是可選的通配符,表示可以接受空白文本。

回答

2
  1. https://regex101.com/r/CuZuMi/4

    I am (?:\d+) years old 
    
  2. https://regex101.com/r/CuZuMi/2

    what color is.*(?:my|your|his|her).*(?:bright red|blue|green|lemon chiffon)?.* 
    
  3. https://regex101.com/r/CuZuMi/3

    .*told me to say.* 
    

我使用的主要是兩件事情:

  1. (?:)非捕捉組,以組共同的東西像數學括號使用。
  2. .*匹配任何字符0次或更多次。可以用{1,3}代替1到3次匹配。

您可以通過+交換*至少匹配1個字符,而不是0 而?非捕獲組後,使該組可選。


這些都是黃金的地方讓你開始:

  1. http://www.rexegg.com/regex-quickstart.html
  2. https://regexone.com/
  3. http://www.regular-expressions.info/quickstart.html
  4. Reference - What does this regex mean?
+0

什麼有關此方案'(+ |。 *)告訴我 說(。+)'。如果在'告訴我說'之前有字符,那麼''之間必須有一個空格以防止字碰撞,例如, 「愛麗絲告訴我說你好,並且」告訴我說你好「應該可以工作,但是」讓我說你好「不會。 – MiP

+1

只要刪除'(。*)告訴我說(。+)'和'Alicetold me to say hi'的空格就會匹配。 – user

相關問題