Apache Помогает на помощь!
import org.apache.commons.text.StringTokenizer
import org.apache.commons.text.matcher.StringMatcher
import org.apache.commons.text.matcher.StringMatcherFactory
@Grab(group='org.apache.commons', module='commons-text', version='1.3')
def str = /is this 'completely "impossible"' or """slightly"" impossible" to parse?/
StringTokenizer st = new StringTokenizer( str )
StringMatcher sm = StringMatcherFactory.INSTANCE.quoteMatcher()
st.setQuoteMatcher( sm )
println st.tokenList
Выход:
[это полностью «невозможно» или, «слегка» невозможно, разобрать?]
Несколько заметок:
- это написано на Groovy ... на самом деле это скрипт на Groovy.
@Grab
строка дает ключ к виду нужной вам линии зависимости
(например, в build.gradle
) ... или просто включите .jar в свой
путь к классу конечно
StringTokenizer
здесь НЕ
java.util.StringTokenizer
... как показывает строка import
,
org.apache.commons.text.StringTokenizer
-
def str = ...
line это способ создания String
в Groovy, который содержит оба
одинарные кавычки и двойные кавычки без необходимости экранирования
StringMatcherFactory
в apache commons-text 1.3 можно найти
здесь : как вы можете видеть, INSTANCE
может предоставить вам
куча разных StringMatcher
с. Вы можете даже свернуть свой собственный:
но вам нужно изучить исходный код StringMatcherFactory
, чтобы
посмотри как это делается.
- ДА! Вы можете не только включить «другой тип цитаты», и он правильно интерпретируется как не являющийся границей токена ... но вы даже можете избежать фактической цитаты, которая используется для отключения токенизации , удваивая кавычку внутри защищенного токенизацией бита String! Попробуйте реализовать это с помощью нескольких строк кода ... или, скорее, не надо!
PS Почему лучше использовать Apache Commons, чем любое другое решение?
Помимо того, что нет смысла заново изобретать колесо, я могу придумать по крайней мере две причины:
- Можно рассчитывать, что инженеры Apache предвосхитят все ошибки и разработают надежный, всесторонне протестированный, надежный код
- Это означает, что вы не загромождаете свой прекрасный код с помощью утилитарных методов - у вас просто есть хороший, чистый кусок кода, который в точности соответствует тому, что написано на банке, оставляя вам возможность заняться интересным прочее ...
PPS Ничто не обязывает вас смотреть на код Apache как на таинственные «черные ящики». Исходный код открыт и написан обычно на «доступной» Java. Следовательно, вы можете исследовать, как все делается с вашим сердцем. Это часто весьма поучительно.
позже
Достаточно заинтригованный вопросом АртБа, я взглянул на источник:
в StringMatcherFactory.java мы видим:
private static final AbstractStringMatcher.CharSetMatcher QUOTE_MATCHER = new AbstractStringMatcher.CharSetMatcher(
"'\"".toCharArray());
... довольно скучно ...
так что это заставляет взглянуть на StringTokenizer.java:
public StringTokenizer setQuoteMatcher(final StringMatcher quote) {
if (quote != null) {
this.quoteMatcher = quote;
}
return this;
}
ОК ... и затем в том же Java-файле:
private int readWithQuotes(final char[] srcChars ...
, который содержит комментарий:
// If we've found a quote character, see if it's followed by a second quote. If so, then we need to actually put the quote character into the token rather than end the token.
... Я не могу больше следовать за подсказками. У вас есть выбор: либо ваше «хакерское» решение, где вы систематически предварительно обрабатываете свои строки перед тем, как отправлять их на токенизацию, превращая | \\\ "| s в | \" \ "| s ... (то есть где вы заменяете каждый | \ " | с | " " |) ...
Или ... вы изучаете org.apache.commons.text.StringTokenizer.java, чтобы выяснить, как настроить код. Это маленький файл. Я не думаю, что это будет так сложно. Затем вы компилируете, по сути, создавая форк кода Apache.
Не думаю, что это можно настроить. Но если вы нашли решение для подстройки кода, которое имело смысл, вы могли бы отправить его в Apache, а затем оно могло бы быть принято для следующей итерации кода, и ваше имя фигурировало бы, по крайней мере, в части Apache «запрос возможностей»: может быть формой kleos , благодаря которой вы достигаете бессмертия программирования ...