Как сопоставить специальные символы, такие как ^ и \, без использования indexOf ()? - PullRequest
1 голос
/ 08 апреля 2020

Я пытаюсь сопоставить строку, если она является действительным «модулем» в моей программе.

Допустимые единицы:

At least one letter, optional / or -, at least one more letter if you did the optional / or -

Текущая попытка : str.matches("[a-zA-z]*[-\\/]?[a-zA-z]*")

Пример:

Valid -> abc/abc
Valid -> abc
Invalid -> abc^abc
Invalid -> abc/abc

Недопустимые случаи отображаются как действительные.

Ответы [ 4 ]

1 голос
/ 08 апреля 2020

Попробуйте:

str.matches("(?i)[a-z]+([-/][a-z]+)?")

Примечания:

  • (?i) включает сопоставление без учета регистра, поэтому вы можете кодировать [a-z] вместо [a-zA-Z], поэтому легче читать
  • + означает «один или несколько»
  • , вам никогда не нужно бежать /. У него нет особого регулярного значения - это просто старый обычный обычный символ
  • (...)?, означающий, что все в скобках необязательно. Вот как вы можете сделать выражение «тире / сл sh плюс буква (ы)» необязательным в целом
0 голосов
/ 08 апреля 2020

Ответ на обновленный вопрос ( версия 3 ):

str.matches("[a-zA-Z]+(?:[-/][a-zA-Z]+)?")

Объяснение

Хотя бы одна буква

[a-zA-Z]+

необязательно ... если вы сделали необязательное / или -

(?:X)? или (X)?

Оба работают, но первый не захватывает, и так как вам не нужно захватывать, это более подходящий для использования.

/ или -

[-/]

хотя бы еще одна буква

[a-zA-Z]+

Тест

public static void main(String[] args) {
    test("abc/abc", "abc", "abc^abc", "abc\\abc");
}
static void test(String... inputs) {
    for (String input : inputs)
        System.out.println((input.matches("[a-zA-Z]+(?:[-/][a-zA-Z]+)?") ? "Valid" : "Invalid") + " -> " + input);
}

Вывод

Valid -> abc/abc
Valid -> abc
Invalid -> abc^abc
Invalid -> abc\abc

От комментарий :

Это лучше , но он терпит неудачу, когда я пытаюсь: abc\abc или abc^abc в качестве строки. Я думаю, что это относится и к тем символам, которые используются регулярным выражением.

Ну, они должны завершиться неудачей в соответствии с перечисленным правилом.

Если вы имели в виду, что хотите чтобы изменить правило, чтобы также разрешить \ и ^, вам нужно добавить их внутри [ ].

Но вы должны знать о специальных символах внутри [ ]:

  • - - особый, указывающий диапазон, например, a-z, но не особенный, если первый или последний. Escape с \, если не первый или последний. Удвойте значение \ в строковом литерале Java до \\.

  • ^ является специальным, если сначала, что означает перевернуть список, например, [^a-z] означает " не строчная буква`.

  • \ всегда особенный, так как он является escape-символом, поэтому вы должны экранировать его как \\, и удваивая их в строковом литерале Java до \\\\.

Что означает:

str.matches("[a-zA-Z]+(?:[-/^\\\\][a-zA-Z]+)?")

Тестовый вывод

Valid -> abc/abc
Valid -> abc
Valid -> abc^abc
Valid -> abc\abc
Invalid -> abc#abc
0 голосов
/ 08 апреля 2020

Попробуйте найти один и только один символ '-' или '/', который находится между хотя бы одним символом с каждой стороны от него:

str.matches("[a-zA-z]{1,}[-\\/]{1}[a-zA-z]{1,}")
0 голосов
/ 08 апреля 2020

Попробуйте следующее регулярное выражение:

"[a-zA-z]+[-|\\/]{1}[a-zA-z]+"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...