Регулярное выражение для сопоставления обратной косой черты внутри строки

1

Я пытаюсь сопоставить следующие строки:

  • this\test_
  • _thistes\t
  • _t\histest

Другими словами, допустимые строки имеют ТОЛЬКО обратную косую черту, разделяя 2 подстроки, которые могут содержать числа, буквы и _ символы.

Я попробовал следующее регулярное выражение, ^[a-zA-Z_][\\\]?[a-zA-Z0-9_]+$ его на http://regexhero.net/tester/: ^[a-zA-Z_][\\\]?[a-zA-Z0-9_]+$

К сожалению, он также распознает следующие недопустимые строки:

  • this\\
  • _\
  • _\w\s\x

Любая помощь, пожалуйста?

Теги:

4 ответа

1
Лучший ответ

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

С помощью:

"^[a-zA-Z_][\\\]?[a-zA-Z0-9_]+$"

Не будет соответствовать ни одному из ваших тестовых примеров, так как это будет соответствовать:

  • ^ начало строки,
  • [a-zA-Z_] 1 альфа-символ или символ подчеркивания,
  • [\\\]? 1 необязательная обратная косая черта,
  • [a-zA-Z0-9_]+ не менее 1 буквенно-цифровой и/или символ подчеркивания,
  • $ end of string

Если вы используете его как необработанную строку (как это интерпретирует его regexhero и обозначается знаком @ до начала строки):

@"^[a-zA-Z_][\\\]?[a-zA-Z0-9_]+$"
  • ^ начало строки,
  • [a-zA-Z_] 1 альфа-символ или символ подчеркивания,
  • [\\\]?[a-zA-Z0-9_]+ один или несколько символов; обратная косая черта, ] ? , буквенно-цифровой и подчеркивающий,
  • $ end of string.

Так что вам действительно нужно:

"^[a-zA-Z0-9_]+\\\\[a-zA-Z0-9_]+$"

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

Или

@"^[a-zA-Z0-9_]+\\[a-zA-Z0-9_]+$"

(Не выполняется подстановка обратной косой черты, поэтому механизм регулярных выражений напрямую интерпретирует скрытую обратную косую черту)

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

  • 0
    Спасибо за ответ, кажется, это самый полный ответ между остальными. Мне нужно было изменить регулярное выражение на следующее, чтобы соответствовать факту, что символ '\' является необязательным: ^ [a-zA-Z0-9 _] + \\? [A-zA-Z0-9 _] + $ я нашел что строки из 1 символа не совпадают (например, «a», «b», «9» и т. д. не распознаются). Почему? Можно ли это исправить?
  • 0
    Да, это!!! ^ [a-zA-Z0-9 _] + \\? [a-zA-Z0-9 _] * $ Еще раз спасибо
Показать ещё 6 комментариев
1

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

@"^\w+\\\w+$"

ИЛИ

@"^[A-Za-z0-9_]+\\[A-Za-z0-9_]+$"

DEMO

  • 1
    errr ... \w значит намного больше. как я понимаю. «Символ слова. Символ во входной строке может принадлежать к любой из категорий Unicode, которые подходят для символов в словах. Для получения дополнительной информации см. Символ слова». - msdn.microsoft.com/en-us/library/20bw873z(v=vs.110).aspx . Лучший пример - ваш будет соответствовать символам с акцентом и тому подобное, тогда как оригинал не будет. (Следует отметить, что размещенный вами демонстрационный сайт не выполняет сопоставление с регулярным выражением c #).
  • 0
    Вы добавили сырье после прочтения моего ответа = /
Показать ещё 6 комментариев
0

Лучший способ исправить ваше регулярное выражение:

^[a-zA-Z0-9_]+\\[a-zA-Z0-9_]+$

Это сводится к:

NODE                     EXPLANATION
--------------------------------------------------------------------------------
  ^                        the beginning of the string
--------------------------------------------------------------------------------
  [a-zA-Z0-9_]+            any character of: 'a' to 'z', 'A' to 'Z',
                           '0' to '9', '_' (1 or more times (matching
                           the most amount possible))
--------------------------------------------------------------------------------
  \\                       '\'
--------------------------------------------------------------------------------
  [a-zA-Z0-9_]+            any character of: 'a' to 'z', 'A' to 'Z',
                           '0' to '9', '_' (1 or more times (matching
                           the most amount possible))
--------------------------------------------------------------------------------
  $                        before an optional \n, and the end of the
                           string

Пояснение любезно предоставлено http://rick.measham.id.au/paste/explain.pl

Как вы можете видеть, у нас есть один и тот же шаблон до и после обратной косой черты (поскольку вы указали, что оба должны быть буквами, цифрами и символами подчеркивания) с модификатором +, означающим хотя бы один. Тогда в середине есть только обратная косая черта, которая является обязательной.

Поскольку неясно, означали ли вы "буквы" основной алфавит, или если вы имели в виду что-либо, что соответствует букве (наиболее явно акцентированные символы, а также любой другой алфавит и т.д.), Тогда вы можете расширить свой набор символов на используя что-то вроде \w как предлагает Авинаш Радж. См. Http://msdn.microsoft.com/en-us/library/20bw873z(v=vs.110).aspx#WordCharacter для получения дополнительной информации о том, что охватывает "символ слова".

0

Довольно уверен, что это сработает, если я все понял.

^([a-zA-Z0-9_]+\\[a-zA-Z0-9_]+)
  • 0
    Вы захотите привязать это к началу и концу строки, чтобы убедиться, что вы не просто сопоставляете подстроку тестируемой строки.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню