Я хочу проверить следующий формат строки:
'(:abc-xyz :abd-xyz-abx :v2-abc)'
Я попытался создать регулярное выражение как:
const regex = RegExp('^[(][:][a-z|0-9|-]+(?: [:][a-z|0-9|-]+)*[)]$');
Он работает для меня в большинстве случаев, но не может проверить, когда строка:
строка = '(:abc--xyz- :abc-xyz-abx- :v2-abc-)'
Как мне проверить строку, чтобы «-» разрешалось между словами, но не в конце каждого слова?
мое требование:
string='(:abc-xyz :abd-xyz-abx :v2-abc)' -> Correct (only valid format others are incorrect).
example :
string='(:abc--xyz :abd-xyz-abx :v2--abc)' -> Incorrect
string='(:abc-xyz :abd-xyz-abx :v2-abc-)' -> Incorrect
string='(:abc-xyz:abd-xyz-abx :v2-abc-)' -> Incorrect
Вам не нужно добавлять класс персонажа для каждого персонажа: вот так [(][:]
. Вы можете опустить []
. Но вам придется избегать метасимволов, таких как (
, с помощью \
Вы можете использовать -
из класса символов и использовать необязательно повторяющиеся группы, в которых вы ставите префикс :
и -
Кроме того, |
в классе символов будет буквально соответствовать вертикальной черте, поэтому вы можете опустить это, если не хотите совпадать с ним.
^\(:[a-z0-9]+(?:-[a-z0-9]+)*(?: :[a-z0-9]+(?:-[a-z0-9]+)*)*\)$
Объяснение
^
Начало строки\(:
Матч (:
[a-z0-9]+
Совпадите 1+ раз с любым из a-z0-9
(?:-[a-z0-9]+)*
По желанию повторить -
и 1+ раз любое из a-z0-9
(?:
Группа без захвата
:[a-z0-9]+
(?:-[a-z0-9]+)*
По желанию повторить -
и 1+ раз любое из a-z0-9
)*
Закройте группу без захвата и повторите 0+ раз\)
Матч )
$
Конец строкиДемонстрация регулярных выражений
let pattern = /^\(:[a-z0-9]+(?:-[a-z0-9]+)*(?: :[a-z0-9]+(?:-[a-z0-9]+)*)*\)$/;
[
"(:abc-xyz :abd-xyz-abx :v2-abc)",
"(:abc--xyz- :abc-xyz-abx- :v2-abc-)",
"(:abc--xyz :abd-xyz-abx :v2--abc)",
"(:abc-xyz :abd-xyz-abx :v2-abc-)",
"(:abc-xyz:abd-xyz-abx :v2-abc-)",
].forEach(s => console.info(`${s} ==> ${pattern.test(s)}`));
Я добавил вам ссылку regex101 - пожалуйста, укажите, ПОЧЕМУ другие недействительны