我有一长串服务器主机名,我需要提取包含两个字母缩写状态的服务器主机名,后跟一个三字母缩写的城市。
例如:
服务器主机名: ohdubgh01sp, nyobg38djek, 123ohdub123as, oh2kjd
这个正则表达式应该拉出前3个但不是最后一个。
我尝试过:
$pattern = "/.*(al|ak|az|ar|ca|co|ct|de|fl|ga|hi|id|il|in|ia|ks|ky|la|me|md|ma|mi|mn|ms|mo|mt|ne|nv|nh|nj|nm|ny|nc|nd|oh|ok|or|pa|pr|ri|sc|sd|tn|tx|ut|vt|vi|va|wa|wv|wi|wy)([a-z]{3}).*/";
这会将我的列表减半,但仍会检索“barker”等项目。什么是一个很好的正则表达式,可以给我最准确的结果?感谢
答案 0 :(得分:1)
你所要求的远远超出正则表达的范畴。
过滤任何有意义的条目的基本问题是“有意义”这个词。计算机不存在这样的事情 - 一切都是有意义的(或无意义,取决于你如何看待它)。鉴于(似乎是)一组自由设计的条目,我们希望做的最好的是将其缩小到更易于管理的大小然后通过手工修剪数据,因为正常程序根本没有人类这样做的水平智能和理解。
以您的情况为例,您需要找到一个双字母状态,然后是三个字母的城市。因为您的输入列表没有立即可识别的模式(除了城市遵循状态),除了为每个有效状态指定每个可能的五个字母缩写之外,您几乎无法让程序修剪该列表。城市组合,即便如此,仍然会有垃圾泄漏。例如,如果有效的州/城市组合是“arche”,则名为“archer”的服务器主机将通过。这对计算机来说都是希腊语。
为了满足您更直接的需求:由于指定每个州/城市组合将花费您的时间而不仅仅是手工修剪,我建议您只使用当前的正则表达式,尽量确定服务器主机共享的任何其他模式(和将它们应用于正则表达式,并手工完成其余的工作。