Regex для соответствия user и user @ domain - PullRequest
0 голосов
/ 20 ноября 2018

Пользователь может войти как «пользователь» или как «пользователь @ домен».Я только хочу извлечь "пользователя" в обоих случаях.Я ищу выражение соответствия, чтобы соответствовать этому, но я борюсь.

final Pattern userIdPattern = Pattern.compile("(.*)[@]{0,1}.*");
final Matcher fieldMatcher = userIdPattern.matcher("user@test");
final String userId = fieldMatcher.group(1)

userId возвращает "user @ test".Я пробовал разные выражения, но мне кажется, что ничто не соответствует моим требованиям: - (

Есть идеи?

Ответы [ 4 ]

0 голосов
/ 22 ноября 2018

Вы включили @ в качестве необязательного, поэтому совпадение пытается получить самое длинное имя пользователя.Поскольку вы не указали ограничение имени пользователя, в нем нельзя указывать @ s, оно соответствует самой длинной строке.

Просто используйте:

[^@]*

в качестве соответствующегоsubexpr для имен пользователей (и используйте $0 для получения совпавшей строки)

Или вы можете использовать этот , который можно использовать для поиска нескольких совпадений (и для получения как пользовательской части, так ичасть домена):

\b([^@\s]*)(@[^@\s]*)?\b

\b заставляет вашу строку привязываться к границам слова, тогда первая группа соответствует непробельным и не @ символам (любое число, лучше использовать+ вместо * там, поскольку имена пользователей должны иметь как минимум один символ), за которым (необязательно) следует @ и еще одна строка не пробелов и не @ символов).В этом случае $0 соответствует всем адресам электронной почты, $1 соответствует части имени пользователя и $2 части @domain (вы можете уточнить только часть домена, добавив новую пару скобок, как в

b([^@\s]*)(@([^@\s]*))?\b

См. демо .

0 голосов
/ 20 ноября 2018

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

Вы можете просто сделать что-то вроде этого:

String userId = "user@test";

if (userId.indexOf("@") != -1)
    userId = userId.substring(0, userId.indexOf("@"));

// from here on userId will be "user".

Это всегда либо удаляет "@test", либо просто пропускает его, когда его нет.

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

0 голосов
/ 20 ноября 2018

Немного погуглив это придумал:

(.*?)(?=@|$)

Будет соответствовать всему, прежде чем дополнительный @

0 голосов
/ 20 ноября 2018

Если вы используете шаблон "(.*)[@]{0,1}.*" с .matches(), (.*) сначала захватывает всю строку, затем, когда индекс регулярного выражения все еще находится в конце строки, шаблон [@]{0,1} срабатывает и совпадает наконец строки, потому что он может соответствовать 0 @ символов, а затем .* снова совпадает в том же месте, как и любые 0+ символов.Таким образом, вся строка попадает в вашу Группу 1.

Вы можете использовать

String userId = s.replaceFirst("^([^@]+).*", "$1");

См. regex demo .

Подробнее

  • ^ - начало строки
  • ([^@]+) - Группа 1 (обозначается $1 из шаблона замены): любые 1+ символов, кроме@
  • .* - остаток строки.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...