Чтобы исключить исключительное исключение индекса массива, следует использовать инструкцию расширенный- for
, где и когда они могут.
Основная мотивация (и использовать), когда вы выполняете итерацию, и вам не требуются сложные шаги итерации. Вы не могли бы использовать расширенный for
для перемещения назад в массиве или только для итерации на каждом другом элементе.
Вы гарантированно не исчерпали элементы для повторения при этом, а ваш [исправленный] пример легко конвертируется.
Код ниже:
String[] name = {"tom", "dick", "harry"};
for(int i = 0; i< name.length; i++) {
System.out.print(name[i] + "\n");
}
... эквивалентен этому:
String[] name = {"tom", "dick", "harry"};
for(String firstName : name) {
System.out.println(firstName + "\n");
}
Я думаю, что так оно и есть. К сожалению, любой, за которым не следует {, расколоет строку, но я смогу их восстановить позже. Меня обманывает одинаковый приоритет правил и жадность регулярных выражений.
/[^"~]+/
все, что не является или «(регулярная строка)
"~{" expression "}"
, нормальное выражение
/~(?!{)/
handle ~ без {. use? !, потому что мы не должны потреблять следующий символ (это может быть "или другое ~)
from lark import Lark
print (Lark(r"""
string: "\"" string_thing* "\""
string_thing: /[^"~]+/
| "~{" expression "}"
| /~(?!{)/
expression: /[^}]+/
""", start='string', ambiguity="explicit").parse(
# '"a"'
'"a~b{}c}d~{1}g"'
# '"~abc~"'
# '"~{1}~~{1}~~~{1}"'
).pretty())
Вот решение вашей проблемы с использованием положительного lookbehind.
(?<=~{)[^}]+
Он ищет начало выражения ~{
и захватывает все до закрытия скобки }
Regex.Matches("(?<=~{)[^}]+", allofyourtext)
– emsimpson92
16 July 2018 в 15:17