Ищу помощь C # RegEx

2

Я пытаюсь создать выражение RegEx, которое успешно проанализирует следующую строку:

"57" "testing123" 82 16 # 13 26 blah blah

То, что я хочу, это иметь возможность идентифицировать числа в строке. В настоящее время я использую следующее:

[0-9]+

который отлично разбирается. Однако, когда это становится сложно, если число в кавычках, например "57" или "тестирование123", я не хочу, чтобы оно соответствовало.

В дополнение к этому, что-либо после знака хэша ( "#" ), я не хочу ничего сопоставлять после знака хеша.

Итак, в этом примере совпадениями, которые я должен получить, являются "82" и "16". Ничто другое не должно совпадать.

Любая помощь по этому поводу будет оценена.

  • 0
    "57" 12 "testing123" 82 16 # 13 26 бла-бла Должно ли совпадать 12?
  • 0
    @blizpasta - Да, потому что 12 не в кавычках и не после хеш-знака.
Показать ещё 4 комментария
Теги:

2 ответа

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

Вам должно быть проще создать 3 разных регулярных выражения, а затем создать логику, которая их объединяет:

  • Проверьте, имеет ли строка # и игнорирует все после нее.
  • Проверьте, для всех совпадений "\ d +", и игнорируйте их все
  • Отметьте все, что осталось, соответствует ли оно [0-9] +
  • 0
    Игорь, твой ответ все больше и больше похож на лучшее решение. Я хочу оставить этот вопрос открытым в течение дня или двух, просто чтобы посмотреть, какие другие умные ответы люди могут придумать
  • 0
    Игорь - я закончил с твоим ответом. Это проще сделать и легче управлять этим способом.
0

. Регулярное выражение .Net может легко анализировать эту строку. Следующий шаблон должен соответствовать всем до комментария:

\A      # Start of the string
(?>
    (?<Quoted>  # A quoted string
        ""          # Open quotes
        [^""\\]*            # non quotes or backslashes
        (?:\\.[^""\\]*)*    # but allow escaped characters
        ""          # Close quotes
    )
    |
    (?<Number>  # A number
        \d+         # some digits
    )
    |
    \s+          # Whitespace separator
)*

Если вы также хотите совместить комментарий, добавьте:

(?<Comment>
    \# .*
)?
\z

Вы можете получить свои номера в одном Match, используя все записи группы "Число":

Match parsed = Regex.Match(s, pattern, RegexOptions.IgnorePatternWhitespace);
CaptureCollection numbers = parsed.Groups["Number"].Captures;

Отсутствие этого шаблона - это, в основном, нецифровые токены строки, такие как 4 8 this 15that, которые могут добавить некоторую сложность, в зависимости от того, как мы хотим, чтобы он работал.

Ещё вопросы

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