Использование может использовать это регулярное выражение,
{{(?:(?!{{).)*\|(?:(?!{{).)*}}
Объяснение:
{{
- Соответствует литералу {{
(?:(?!{{).)*
- Соответствует любому тексту, кроме литерального {{
, также называемого Закаленный жадный жетон \|
- Соответствует трубе |
символ (?:(?!{{).)*
соответствует любому тексту, кроме литерала {{
}}
- Соответствует литералу }}
[ 1126] Кроме того, в случае, если есть подобные вложенные шаблоны, и вы хотите соответствовать большинству внутренних шаблонов, вы можете использовать это регулярное выражение,
{{(?:(?!{{|}}).)*\|(?:(?!{{|}}).)*}}
Демонстрация 2 [ 1133]
Проверьте этот код Ruby,
re = /{{(?:(?!{{|}}).)*\|(?:(?!{{|}}).)*}}/
str = 'Testing some text{{ {{ first_name | mask }} }} and another {{ city }} and again {{ state | mask_trail }}'
str.scan(re) do |match|
puts match.to_s
end
Выходы,
{{ first_name | mask }}
{{ state | mask_trail }}
Онлайн-демонстрация Ruby [ 1130]
Если вы заботитесь о производительности (а я не советую вам это делать), подход, основанный на попытках, является очевидным победителем (по сравнению с вашим подходом на основе секций или подходом регулярных выражений), если вы не ожидаете много недопустимых строк, и в этом случае он потенциально медленнее (предположительно из-за стоимости обработки исключений).
Опять же, Я не предлагаю вам заботиться о производительности, просто даю вам данные на случай, если вы делаете это 10 миллиардов раз в секунду или что-то в этом роде. Кроме того, основанный на разделах код не обрабатывает хотя бы одну допустимую строку.
$ ./floatstr.py F.. partition sad: 3.1102449894 partition happy: 2.09208488464 .. re sad: 7.76906108856 re happy: 7.09421992302 .. try sad: 12.1525540352 try happy: 1.44165301323 . ====================================================================== FAIL: test_partition (__main__.ConvertTests) ---------------------------------------------------------------------- Traceback (most recent call last): File "./floatstr.py", line 48, in test_partition self.failUnless(is_float_partition("20e2")) AssertionError ---------------------------------------------------------------------- Ran 8 tests in 33.670s FAILED (failures=1)
Здесь '
Вот полезный трюк, который вы можете использовать, чтобы сделать его действительно легким, как ни странно, я только что обсуждал это 30 минут назад с другом.
~ / .ssh / config
IdentityFile ~/.ssh/ident/%r@%h IdentityFile ~/.ssh/id_rsa IdentityFile ~/.ssh/id_dsa
Это делает действительно легко использовать запасной вариант, так как параметры выполняются сверху вниз.
Затем, чтобы указать конкретный ключ для « Bob @ someHost », вам просто нужно создать файл
~/.ssh/ident/Bob@someHost
, и он попытается сначала при входе на этот хост.
Если файл не может быть найден или ключ отклонен, он попробует следующий, в этом случае
~/.ssh/id_rsa
Преимущество этого метода заключается в том, что вам не нужно добавлять новую запись каждый раз, когда вы добавляете Другой хост, все, что вам нужно сделать, это создать ключевой файл в нужном месте, и он сделает все остальное автоматически.
со страницы руководства ssh:
-i identity_file
Selects a file from which the identity (private key) for RSA or
DSA authentication is read. The default is ~/.ssh/identity for
protocol version 1, and ~/.ssh/id_rsa and ~/.ssh/id_dsa for pro-
tocol version 2. Identity files may also be specified on a per-
host basis in the configuration file. It is possible to have
multiple -i options (and multiple identities specified in config-
uration files).