Я предполагаю (частично из-за примера в вопросе), что совпадения должны исключать строки, начинающиеся с «{{» и заканчивающиеся «}}», содержащие «|», которые также содержат «{{». Например, ни
"{{ a | {{ b }}"
, ни
"{{ a | {{ b }} c }}"
не должны совпадать. Если они должны быть сопоставлены, можно использовать регулярное выражение, предложенное @ WiktorStribiżew в комментарии к вопросу.
Вы можете получить желаемые соответствия следующим образом.
str = "Testing some text {{ first_name | mask }} and another {{ city }} " +
"and again {{ state | mask_trail }}"
R = /
{{ # match '{{'
((?!{{).) # match one character not preceded by '{{'. Save in capture group 1
* # perform capture to group 1 zero or more times
\| # match '|'
\g<1> # execute subroutine defined by capture group 1
* # perform preceding match zero or more times
}} # match '}}'
/x # free-spacing regex definition mode
или, кратко,
R = /{{((?!{{).)*\|\g<1>*}}/
str.gsub(R).to_a
#=> ["{{ first_name | mask }}", "{{ state | mask_trail }}"]
Я не могу использовать String # scan , потому что Я не хотел возвращать содержимое группы захвата. Поэтому я использовал String # gsub без блока, чтобы вернуть перечислитель, который генерирует совпадения, а затем преобразовал его в массив совпадений. Здесь - обсуждение подпрограмм регулярного выражения или подвыражений.
Я позаимствовал (?!{{).
из ответа @ Пушпеша.
В мире Java сайт, который вы упомянули, действительно компортирует API, Instant Holiday Connection , который мог бы стать хорошим решением (лучше, чем очистка экрана).
API-интерфейс Light Development Holiday Client - это библиотека классов Java, позволяющая беспрепятственно интегрировать произвольные другие приложения с World Calendar Calendar Service , чтобы они знали о специальных днях наблюдений по всему миру.
Тем не менее, бесплатная версия предоставляет доступ только к прошлогодним праздникам ...
Другой (более общедоступной) базой данных будет Календарь Земли , бесплатный, но без видимого API (снова на экранные скриншоты) )
time and date.com , похоже, также имеет все праздники для всех стран (опять же без видимого API).
У них есть полный список праздников , хотя
Один из подходов состоит в том, чтобы позволить вашим пользователям вводить национальные праздники, о которых они знают и влияют на их работу. Вы должны быть осторожны, хотя, в одном из IB, на котором я работал, мы заметили, что один из трейдеров ввел Национальный день шашлыка в своей торговой системе как турецкий праздник.