регулярное выражение: поиск символа все еще не совершенен - PullRequest
1 голос
/ 15 июня 2010

у меня есть этот код:

<script type="text/javascript">
var str="KD-R35H2UND";
var patt1=/[G|T|EE|EJU].*D/i;
document.write(str.match(patt1));
</script>

с помощью кода на var patt1=... я могу показать так:

if i type KD-R35ED => SHOW ED
KD-R35UND => UND
KD-R35JD => JD
KD-R35TJD => TJD
KD-R35EED=> EED

моя проблема: если я наберу KD-R35GD, он может показать GD, но если KD-R35D, он ничего не сможет показать .. как это сделать?

Ответы [ 3 ]

2 голосов
/ 15 июня 2010

b* означает «соответствовать нулю или большему количеству вхождений b».

. означает «соответствовать любому символу, кроме новой строки».

[EE|EJU] означает «соответствует E, |, J или U».

.* означает «соответствовать любому символу, кроме символа новой строки ноль или более раз».

D означает «соответствовать a D».

Итак, регулярное выражение делает то, что вы просили.

Из примеров, приведенных вами в вашем вопросе, я предполагаю, что действительные правила должны быть:

  1. Строка начинается с KD-R35.
  2. Затем может следовать любое количество буквенно-цифровых символов, если
  3. среди них есть E, J или U и
  4. строка заканчивается на D.

Эти правила, как регулярное выражение, гласят:

^         # start of string
KD-R35    # literal text
(         # start of capturing group
  \w*     # any number of alphanumeric characters
  [EJU]   # at least one of E, J, or U
  \w*     # any number of alphanumeric characters
  D       # a D
)         # end of capturing group
$         # end of string

или, в JavaScript:

match = subject.match(/^KD-R35(\w*[EJU]\w*D)$/i);
if (match != null) {  // successful match
    mytext = match[1] // capturing group 1
} else {
    // Match attempt failed
}

Я предполагаю, что прописные / строчные буквы не имеют значения.

РЕДАКТИРОВАТЬ: Эм, ваше новое редактирование меняет правила. Кажется, что любая строка допускается, если она начинается с KD-R35 и заканчивается D. В этом случае регулярное выражение будет просто /^KD-R35(\w*D)$/i.

0 голосов
/ 16 июня 2010
<script type="text/javascript">
var str="KD-R35H2UND";
var patt1=/.{2}-.{3}(.*)/;
document.write(str.match(patt1));
</script>

Я перехожу на этот, но показываю KD-R35H2UND,H2UND

0 голосов
/ 15 июня 2010

Одинакова ли первая часть строки (KD-R35) (или хотя бы формат) для всех экземпляров строки, которую вы хотите проверить?

Можете ли вы написать список примеров строк и извлечений, которые вы хотели бы получить после соответствия регулярному выражению.

Например:

  • KD-R35HASDF => HASDF
  • KD-R35H1234 => H1234
  • KD-R35HASDA => HASDA
  • KD-R35HG54G => HG54G
  • KD-R35HD23D => HD23D

Если это так, то это регулярное выражение может помочь:

* * Тысяча двадцать-один {2} \ -.. (. *) {3} * * 1 022

Значение:

  1. любой символ 2 раза
  2. знак минус
  3. любой символ 3 раза
  4. CAPTURE - любой символ любое количество раз

HTML:

    <script type="text/javascript">
        var str1="KD-R35HASDF";
        var str2="KD-R35H1234";
        var str3="KD-R35HASDA";
        var str4="KD-R35HG54G";
        var str5="KD-R35HD23D";
        var patt1=/.{2}\-.{3}(.*)/;
        document.write(str1.match(patt1)[1] + "<br>");
        document.write(str2.match(patt1)[1] + "<br>");
        document.write(str3.match(patt1)[1] + "<br>");
        document.write(str4.match(patt1)[1] + "<br>");
        document.write(str5.match(patt1)[1] + "<br>");
    </script>

И обратите внимание, что str5.match (patt1) возвращает массив, поэтому используйте второй элемент следующим образом:

* * 1 042 str5.match (patt1) [1]

и вы получите результат, который вы ищете

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...