我的正则表达式需要解析一个如下所示的地址:
BLOOKKOKATU 20 A 773 00810 HELSINKI SUOMI
-------------------- ----- -------- -----
1 2 3 4*
第一组,第二组和第三组将始终存在于地址中。第4组可能不存在。我写了一个正则表达式,帮助我得到第一,第二和第三部分,但我还需要第四部分。第4部分是国家/地区名称,可以是FINLAND
或SUOMI
。如果第四部分不存在于地址中,则第四部分将为空。这是我的正则表达式到目前为止,但第三组也抓住了这个国家。有什么帮助吗?
(.*?)\s(\d{5})\s(.*)$
(我将使用这个Oracles REGEXP功能)
答案 0 :(得分:12)
将正则表达式更改为:
(.*?)\s(\d{5})\s(.+?)\s?(FINLAND|SUOMI)?$
使第三组无贪婪将让您匹配可选空格+国家/地区选择。如果第4组不匹配,我认为它将是未初始化而不是空白,这取决于语言。
答案 1 :(得分:2)
试试这个:
(.*?)\s(\d{5})\s(.*?)\s?([^\s]*)?$
答案 2 :(得分:2)
要匹配可能存在或不存在的字符(或您的案例组),您需要在相关字符/子模式/类之后使用?
。我现在回答,因为RegEx很复杂,应该解释一下:只发布没有答案的修复是不够的!
问号匹配前面的字符,类或子模式中的零个或一个。将此视为“前面的项目是可选的”。例如,colou?r匹配颜色和颜色,因为“u”是可选的。
答案 3 :(得分:0)
这会更紧密地匹配您的输入,并且您的每个组都在其自己的正则表达式组中:
(\w+\s\d+\s\w\s\d+)\s(\d+)\s(\w+)\s(\w*)
或者如果空格正常而不是“空白”:
(\w+ \d+ \w \d+) (\d+) (\w+) (\w*)
答案 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.
的问候,
罗布。