我尝试按数字类型标记以下片段:
"(0-22) 222-33-44, 222-555-666, tel./.fax (111-222-333) 22-33-44 UK, TEL/faks: 000-333-444, fax: 333-444-555, tel: 555-666-888"
和
"tel: 555-666-888, tel./fax (111-222-333) 22-33-44 UK"
和
"fax (111-222-333) 22-33-44 UK, TEL/faks: 000-333-444, fax: 333-444-555"
等等。
其概念是,这可以是“tel/faks”和其后的“tel/fax 号码”的任意组合,或者只是字符串开头的“tel/fax 号码”。
我做这个:
"(?:.(?!((tel|fax|faks)[ /:.]+)+))++"
在示例 1 中,但在 find() 之后它返回:(字符“_”是我添加的)
-
_(0-22) 222-33-44, 222-555-666,_
_电话./_
_传真 (111-222-333) 22-33-44 英国,_
_电话_
_FAKS:000-333-444,_
_传真:333-444-555_
似乎我在每个组中丢失了一个字符,并且诸如“TEL/faks”之类的组合类型被拆分。我还需要抓取(如果存在,如果不存在则默认号码是电话)以供将来处理。
如何摆脱这个问题?
ps。我使用:不区分大小写
最佳答案
你的正则表达式的意思(大致):
(?: Match a group consisting of:
. any character
(?! that is not followed by
((tel|fax|faks)[ /:.]+)+)) "tel" or "fax" or "fakx", followed by at least one
punctuation character from [ /:.]
+ (multiple times)
这就是为什么你会在“Tel”、“Fax”等之前缺少一个字符 - 因为你的正则表达式表示永远不会匹配“Tel”、“Fax”等之前的字符。
这也是“Tel./.faks:”被分割的原因 - 因为最后一个“.”出现在“fax”之前,因此不会匹配。
我建议构造两个匹配的正则表达式:
A - a telephone number (parens, digits, commas, spaces), with at least one digit
B - a telephone/fax designation ("fax", "faks", "tel", punctuation)
然后搜索匹配的字符串
B*A+
关于java.util.regex 匹配表达式之前的任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3088935/