正则表达式匹配有限数量的字符,包括无限数量的空格?

时间:2013-09-11 00:41:30

标签: regex perl

我正在寻找美国地址(粗略搜索),方法是将regular expression匹配到2-5位或一些邮政信箱,然后是10-100个字符,然后是状态和拉链。

我试图将中间匹配限制为包含新行的任何字符的10到100,同时特别允许在其中包含无限数量的空白字符(所有其他字符限制为总共100个)。例如,以下字符串将匹配:

"12345 First St. [hundreds of white space characters]
 Some Town, [hundreds of white space characters]
 CA 92107"

除了无限空格外,这个正则表达式与我的模式匹配。

$regex = '/(.|\n|\r\n){10,100}/';

我已经尝试过将此无限制的空白与此模式匹配,但它不起作用:

$regex = '/(.|\s+|\n|\r\n){10,100}/';

对于上下文,我用来查找地址的完整正则表达式如下:

$regex = "/\b(\d{2,5}|po|p\.o\.|post office)(.|\n|\r\n){10,100}(AK|Alaska|AL|Alabama|AR|Arkansas|AZ|Arizona|CA|California|CO|Colorado|CT|Connecticut|DC|Washington\sDC|Washington\D\.C\.|DE|Delaware|FL|Florida|GA|Georgia|GU|Guam|HI|Hawaii|IA|Iowa|ID|Idaho|IL|Illinois|IN|Indiana|KS|Kansas|KY|Kentucky|LA|Louisiana|MA|Massachusetts|MD|Maryland|ME|Maine|MI|Michigan|MN|Minnesota|MO|Missouri|MS|Mississippi|MT|Montana|NC|North\sCarolina|ND|North\sDakota|NE|New\sEngland|NH|New\sHampshire|NJ|New\sJersey|NM|New\sMexico|NV|Nevada|NY|New\sYork|OH|Ohio|OK|Oklahoma|OR|Oregon|PA|Pennsylvania|RI|Rhode\sIsland|SC|South\sCarolina|SD|South\sDakota|TN|Tennessee|TX|Texas|UT|Utah|VA|Virginia|VI|Virgin\sIslands|VT|Vermont|WA|Washington|WI|Wisconsin|WV|West\sVirginia|WY|Wyoming)(\s|\n|\r\n|\&nbsp\;){1,3}\d{5}/i"

2 个答案:

答案 0 :(得分:4)

尝试以下中间比赛:

\s*(?:\S\s*){10,100}

正则表达式:

\s*            whitespace (\n, \r, \t, \f, and " ") (0 or more times)
 (?:           group, but do not capture (between 10 and 100 times)
  \S           non-whitespace (all but \n, \r, \t, \f, and " ")
  \s*          whitespace (\n, \r, \t, \f, and " ") (0 or more times)
 ){10,100}     end of grouping

所以你可以从表达式开始......

(\d{2,5}|post office|p[\. ]?o\.?)(\s*(?:\S\s*){10,100})

与您的数据一起实时demo

答案 1 :(得分:0)

您可以添加锚定前瞻以断言非空白的总数:

^(?=(\s*\S){10,100)\s*$)\d{1,5}.*[A-Z]{2}\s+\d{5}$

前瞻断言有10-100个非空白字符。我还根据你的评论粗略地为实际地址做了一个基本的正则表达式。