4

cityList という名前のデータの次の配列があります。

 var cityList = [

     "Anaa, French Polynesia (AAA)",
     "Arrabury, Australia (AAB)",
     "Al Arish, Egypt (AAC)",
     "Ad-Dabbah, Sudan (AAD)",
     "Annaba, Algeria (AAE)",
     "Apalachicola, United States (AAF)",
     "Arapoti, Brazil (AAG)",
     "Aachen, Germany (AAH)",
     "Arraias, Brazil (AAI)",
     "Awaradam, Suriname (AAJ)",
     "Aranuka, Kiribati (AAK)",
     "Aalborg, Denmark (AAL)"
 ];

最初に文字列の先頭から都市名を検索したいと思います。

次に、文字列のコード部分を検索します: AAA、AAB、AAC など...

最初に都市名に、次に都市コードに、JavaScript 正規表現として検索パターンを適用したいと考えています。

ここに私の正規表現があります:

 //  this regular expression used for search city name
 var matcher = new RegExp("^" + re, "i");

 //  this regular expression used for search city code
 var matcher = new RegExp("([(*)])" + re, "i");

これら 2 つの正規表現を、説明どおりに機能する単一の正規表現に結合するにはどうすればよいですか?

4

6 に答える 6

2

私はこれを提案します:

var myregexp = /^([^,]+),[^(]*\(([^()]+)\)/;
var match = myregexp.exec(subject);
if (match != null) {
    city = match[1];
    code = match[2];
} 

説明:

^        # Start of string
(        # Match and capture (group number 1):
 [^,]+   # One or more characters except comma (alternatively insert city name)
)        # End of group 1
,        # Match a comma
[^(]*    # Match any number of characters except an opening parenthesis
\(       # Match an opening parenthesis
(        # Match and capture (group number 2):
 [^()]+  # One or more characters except parentheses (alt. insert city code)
)        # End of group 2
\)       # Match a closing parenthesis

これは、都市名にコンマが含まれないことを前提としています(そうでない場合、この正規表現はコンマの前の部分のみをキャプチャします)。したがって、可能であればデータを確認する必要があります。例を考えることはできませんが、それは何も言っていません:)

于 2012-10-10T06:09:41.553 に答える
1

ここでは、まったく異なるアプローチ (ECMA-262 標準) を提案します。

とにかく正規表現を使用するには線形検索が必要なため、データを前処理できる場合は、都市オブジェクトの配列を設定できます。

function City(name, country, code){
  this.cityName = name;
  this.cityCountry = country;
  this.cityCode = code;
}

var cities = [];
cities.push(new City('Anaa', 'French Polynesia', 'AAA'));
// ... push the other cities

そして検索機能:

function GetCity(cityToSearch, cities){
  var res = null;
  for(i=0;i<cities.length;i++){
    if(cities[i].city = cityToSearch
      res = cities[i]; 
  }
  return res;
}

実行時:

var codeFound = '';
var cityFound = GetCity('Arraias');
if(cityFound != null)
  codeFound = cityFound.cityCode;

述べる

どちらの場合も、都市配列に世界のすべての都市を入力する場合、都市名は重要ではありません! たとえば、アメリカには「Springfield」が半ダースあります。その場合、より良いアプローチは、2 フィールド キーを使用することです。

于 2012-10-10T08:22:29.783 に答える
0

いくつかの簡単な手順でこれを達成したいと思います。

  1. 最初の括弧の前後で配列内の各文字列を分割します

  2. 最初の正規表現を文字列の最初の部分に適用します。結果を、おそらくmatchOneという名前のブール変数として保存します

  3. 2 番目の正規表現を文字列の 2 番目の部分に適用します (閉じ括弧を削除することを忘れないでください)。結果を、おそらくmatchTwoという名前のブール変数として保存します。

  4. 2 つの数学のいずれかが成功したかどうかをテストします。return ( matchOne || matchTwo );

于 2012-10-10T06:26:46.430 に答える