Как насчет этого, если вам не нужны маски с одинаковым количеством символов исходных строк (что более анонимно):
(?<=^.)[^@]*|(?<=@.).*(?=\.[^.]+$)
Например, если вы замените совпадения на ***
, результатом будет:
j***@e***.com
В первом случае вы выполняете in.read()
вне цикла. Во втором случае вы получаете in.read()
внутри выполнения цикла.
Помните, что условие цикла вычисляется на каждой итерации, поэтому вы выполняете doinb in.read
на каждой итерации.
Может быть, вы хотели это сделать
for(int t=0,tests=<Integer.parseInt(in.readLine());t<tests;t++) {body}
?
Согласно Спецификации языка Java :
BasicForStatement: for ( ForInitopt ; Expressionopt ; ForUpdateopt ) Statement ForStatementNoShortIf: for ( ForInitopt ; Expressionopt ; ForUpdateopt ) StatementNoShortIf ForInit: StatementExpressionList LocalVariableDeclaration ForUpdate: StatementExpressionList StatementExpressionList: StatementExpression StatementExpressionList , StatementExpression
14.14.1.2. Итерация для оператора
& nbsp; & nbsp; & nbsp; & nbsp; Затем выполняется шаг для итерации, как показано ниже:
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; это оценивается. Если результат имеет тип Boolean, он подлежит распаковке без преобразования (§5.1.8).
blockquote>Другими словами,
t < Integer.parseInt(in.readLine())
выполняется один раз за каждую итерацию цикла.Это лучше объяснено в Java Tutorial :
Оператор for обеспечивает компактный способ итерации по диапазону значений. Программисты часто называют его «циклом for» из-за того, как он многократно повторяется, пока не будет выполнено определенное условие. Общая форма оператора for может быть выражена следующим образом:
for (initialization; termination; increment) { statement(s) }
При использовании этой версии оператора for имейте в виду, что:
blockquote>
- Выражение инициализации инициализирует петля; выполняется один раз, когда начинается цикл.
- Когда выражение завершения оценивается как ложное, цикл завершается.
- Выражение приращения вызывается после каждой итерации цикла ; для этого выражения вполне приемлемо увеличивать или уменьшать значение.
Если вы хотите что-то похожее на
for t in range(int(input())
, вы можете использовать Streams API:import static java.lang.Integer.parseInt; import static java.lang.System.console; // option 1 try (final BufferedReader console = new BufferedReader(new InputStreamReader(System.in))) { IntStream.range(0, parseInt(console.readLine())).forEach(i -> { System.out.println(i); }); } // option 2 (fails in some IDEs as console() will return null) IntStream.range(0, parseInt(console().readLine())).forEach(i -> { System.out.println(i); });