匹配可能存在或可能不存在的组

时间:2011-07-12 12:16:48

标签: regex oracle plsql

我的正则表达式需要解析一个如下所示的地址:

BLOOKKOKATU 20 A 773 00810 HELSINKI SUOMI
-------------------- ----- -------- -----
          1            2       3      4*

第一组,第二组和第三组将始终存在于地址中。第4组可能不存在。我写了一个正则表达式,帮助我得到第一,第二和第三部分,但我还需要第四部分。第4部分是国家/地区名称,可以是FINLANDSUOMI。如果第四部分不存在于地址中,则第四部分将为空。这是我的正则表达式到目前为止,但第三组也抓住了这个国家。有什么帮助吗?

(.*?)\s(\d{5})\s(.*)$

(我将使用这个Oracles REGEXP功能)

5 个答案:

答案 0 :(得分:12)

将正则表达式更改为:

(.*?)\s(\d{5})\s(.+?)\s?(FINLAND|SUOMI)?$

使第三组无贪婪将让您匹配可选空格+国家/地区选择。如果第4组不匹配,我认为它将是未初始化而不是空白,这取决于语言。

答案 1 :(得分:2)

试试这个:

(.*?)\s(\d{5})\s(.*?)\s?([^\s]*)?$

答案 2 :(得分:2)

要匹配可能存在或不存在的字符(或您的案例组),您需要在相关字符/子模式/类之后使用?。我现在回答,因为RegEx很复杂,应该解释一下:只发布没有答案的修复是不够的!

  

问号匹配前面的字符,类或子模式中的零个或一个。将此视为“前面的项目是可选的”。例如,colou?r匹配颜色和颜色,因为“u”是可选的。

以上引自http://www.autohotkey.com/docs/misc/RegEx-QuickRef.htm

答案 3 :(得分:0)

这会更紧密地匹配您的输入,并且您的每个组都在其自己的正则表达式组中:

(\w+\s\d+\s\w\s\d+)\s(\d+)\s(\w+)\s(\w*)

或者如果空格正常而不是“空白”:

(\w+ \d+ \w \d+) (\d+) (\w+) (\w*)
  • 第1组:BLOOKKOKATU 20 A 773
  • 第2组:00810
  • 第3组:赫尔辛基
  • 第4组:SUOMI(可选 - 不必匹配)

答案 4 :(得分:0)

(.*?)\s(\d{5})\s(\w+)\s(\w*)

一个例子:

   SQL> with t as
      2  ( select 'BLOOKKOKATU 20 A 773 00810 HELSINKI SUOMI' text from dual
      3  )
      4  select text
      5       , regexp_replace(text,'(.*?)\s(\d{5})\s(\w+)\s(\w*)','\1**\2**\3**\4') new_text
      6    from t
      7  /


TEXT
-----------------------------------------
NEW_TEXT
-----------------------------------------------------------------------------------------
BLOOKKOKATU 20 A 773 00810 HELSINKI SUOMI
BLOOKKOKATU 20 A 773**00810**HELSINKI**SUOMI


1 row selected.

的问候,
罗布。