RegEx для проверки символа X ставит после другого символа - PullRequest
0 голосов
/ 18 мая 2019

Я сделал очень простой шаг, который проверяет наличие одного специального символа. Следующий шаг нуждается в некотором совете, так как я хочу иметь возможность искать другой специальный символ, начиная с 1 места после нахождения #.

var reg = /#/;
alert(reg.test(string))

Например:

abc#.123     //invalid - as . is immediately after #
abc#12.3     //valid  - as . is more than 1 character after #
abc#abcd.23  //valid - as . is more than 1 character after #
a#123.12     //valid - as . is more than 1 character after #
a#12123124.12 //valid - as . is more than 1 character after #
abcd#1231.09  //valid - as . is more than 1 character after #
1.23#12312.01 //invalid - as . is before #
123#122.01#12 //invalid - as there is another# after .

Таким образом, разрыв между # и . всегда должен составлять 1 или более символов, при этом # всегда идет первым.

Ответы [ 3 ]

2 голосов
/ 18 мая 2019

Вы можете установить начало строки ^, не совпадать с # или ., используя отрицательный класс символов [^#.], а затем сопоставить #.

Затем повторите эту часть, но затем для точки, а затем повторите эту часть до конца строки:

^[^#.]*#[^.#]+\.[^.#]*$

Regex demo

Пояснение

  • ^ Начало строки
  • [^#.]*# Совпадение 0+ раз не # или ., затем совпадение #
  • [^.#]+\. Совпадение 1+ раз, а не . или #, затем совпадение с точкой
  • [^.#]* Совпадение 0+ раз, не . или #
  • $ Конец строки

let pattern = /^[^#.]*#[^.#]+\.[^.#]*$/;
[
  "abc#.123",
  "abc#12.3",
  "abc#abcd.23",
  "a#123.12",
  "a#12123124.12",
  "abcd#1231.09",
  "1.23#12312.01",
  "123#122.01#12"
].forEach(s => console.log(s + ": " + pattern.test(s)))
1 голос
/ 18 мая 2019

Вы можете использовать это регулярное выражение, чтобы убедиться, что за первым # в вашей строке следует точка ., где разрыв между # и . равен одному или нескольким символам,

^[^#]*#[^.]+\.

Объяснение:

  • ^ - Начало строки
  • [^#]* - Ноль или более символов, отличных от #, и если вы хотите поставить точку натакже не отображается перед #, тогда вы можете изменить его на [^#.]*
  • # - сопоставить первый # символ
  • [^.]+ - сопоставить один или несколько символов с другимичем точка
  • \. - соответствует буквальной точке

Regex Demo

JS Code demo,

const arr = ['abc#.123','abc#12.3','abc#abcd.23','a#123.12','a#..dd']

arr.forEach(s => console.log(s + " --> " + /^[^#]*#[^.]+\./.test(s)))
1 голос
/ 18 мая 2019

Вы можете использовать /^[^\.#]*#[^\.#]+\.[^\.#]*$/.

^  beginning of line anchor
 [^\.#]*  zero or more characters other than . and #
        #  literal # character
         [^\.#]+  one or more characters other than . and #
                \.  literal . character
                  [^\.#]*  one or more characters other than . and #
                         $  EOL

В общем, используйте /^[^\.#]*#[^\.#]{5,}\.[^#\.]*$/, если вы хотите минимальный зазор определенного размера (в данном случае 5 или более), или {5}, если вы хотите, чтобы зазор был точно 5.

var reg = /^[^\.#]*#[^\.#]+\.[^\.#]*$/;

[
  "abc#.123",      // invalid - as . is immediately after #
  "abc#12.3",      // valid - as . is more than 1 character after #
  "abc#abcd.23",   // valid - as . is more than 1 character after #
  "a#123.12",      // valid - as . is more than 1 character after #
  "a#12123124.12", // valid - as . is more than 1 character after #
  "abcd#1231.09",  // valid - as . is more than 1 character after #
  "1.23#12312.01", // invalid - as . is before #
  "123#122.01#12", // invalid - as there is another# after .
].forEach(test => console.log(reg.test(test)));
...