Это потому, что метод Scanner.nextInt
не использует символ последней новой строки вашего ввода и, следовательно, newline потребляется в следующий вызов Scanner.nextLine
.
Вы столкнетесь с аналогичным поведением, когда вы используете Scanner.nextLine
после Scanner.next()
или любого метода Scanner.nextFoo
(кроме самого nextLine
).
Обход проблемы:
Scanner.nextLine
вызов после Scanner.nextInt
или Scanner.nextFoo
, чтобы потреблять остальную часть этой линии, включая newline int option = input.nextInt();
input.nextLine(); // Consume newline left-over
String str1 = input.nextLine();
Scanner.nextLine
и преобразуете свой ввод в нужный формат. Например, к целому числу с использованием метода Integer.parseInt(String)
. int option = 0;
try {
option = Integer.parseInt(input.nextLine());
} catch (NumberFormatException e) {
e.printStackTrace();
}
String str1 = input.nextLine();
Интересной особенностью модуля regex является именованный список. При этом вам не нужно включать несколько альтернатив, разделенных |
в группе без захвата. Вам нужно только определить список раньше и ссылаться на него в шаблоне по его имени. Пример:
import regex
words = [ ['a', 'the', 'one'], ['reason', 'reasons'], ['for', 'of'] ]
pattern = r'\m \L<word1> \s+ \L<word2> \s+ \L<word3> \M'
p = regex.compile(pattern, regex.X, word1=words[0], word2=words[1], word3=words[2])
s = 'the reasons for'
print(p.search(s))
Даже если эта функция не является существенной, она улучшает читаемость.
Вы можете добиться чего-то подобного с re-модулем, если вы присоединитесь к элементам с |
до:
import re
words = [ ['a', 'the', 'one'], ['reason', 'reasons'], ['for', 'of'] ]
words = ['|'.join(x) for x in words]
pattern = r'\b ({}) \s+ ({}) \s+ ({}) \b'.format(*words)
p = re.compile(pattern, re.X)
Используйте круглые скобки для группировки:
'\b(a|the|one) reason(|s) (for|of)\b'
Я оставил предложение-internal \b
, так как из них вытекают пробелы: пробел, следующий за буквой, всегда является границей слова. В общем, вы должны поместить \b
за пределы альтернатив;
Если это имеет значение, вы можете использовать «не захватывающие группы» во всех современных двигателях с регулярным выражением: используйте (?:stuff)
вместо (stuff)
. Но если это не имеет значения для ваших целей, или вам нужно знать, какие из слов на самом деле присутствуют, перейдите к простым парам.
Модификатор регулярного выражения A|B
означает, что «если совпадают либо A, либо B, то все это соответствует». Таким образом, в вашем случае результирующее регулярное выражение соответствует if / where any из следующих 5 регулярных выражений:
\ba\b
\bthe\b
\bone\b \breason\b
reasons\b \bfor\b
\bof\b
Чтобы ограничить степень к которому применяется |
, используйте неудерживающую группировку для этого, то есть (?:something|something else)
. Кроме того, для необязательного s
в конце reason
вам не нужно использовать изменения; это точно равно reasons?
.
Таким образом, мы получаем регулярное выражение \b(?:a|the|one) reasons? (?:for|of)\b
.
Обратите внимание, что вам не нужно использовать граничные операторы слова \b
в пределах регулярное выражение, только в начале и в конце (в противном случае оно будет соответствовать чему-то вроде everyone reasons forever
).
s?
, но вопрос состоял в том, чтобы группировать альтернативы, а не искать reason|reasons
– alexis
29 August 2015 в 09:05
Как я понимаю, вы хотите, чтобы какое-то регулярное выражение выглядело так:
(?:a|the|one)\s+(?:reason|reasons)\s+(?:for|of)
Это так просто, просто объедините их с помощью групп .
см .: DEMO
Обратите внимание на ваше требование выше, его звук для меня не настолько строгий, если вы хотите что-то изменить самостоятельно, давайте рассмотрим объяснение ниже
Объяснение
(?:abc|ijk|xyz)
Любое слово abc
, ijk
или xyz
, сгруппированное по группе без захвата (?:...)
, означает, что это слово не будет записываться в regex variable $1
, $2
, $3
, ...
.
\s+
Это разделитель слов, который здесь я устанавливал как любые пробелы, +
обозначает 1 или более.
Вам нужно использовать группу захвата, чтобы отказаться от смешивания OR (|
)
(\ba\b|\bthe\b|\bone\b) (\breason\b|reasons\b) (\bfor\b|\bof\b)
. И затем, как более элегантный способ, вы можете поместить границы слов вокруг групп. Также обратите внимание что, когда вы используете пространство в своем регулярном выражении вокруг слов, нет необходимости использовать границу слова. И для reasons
и reason
вы можете сделать последний s
опционным с ?
. И обратите внимание, что если вы не хотите, чтобы ваши слова соответствовали отдельным группам, вы можете сделать группы группами, не имеющими захвата, :?
.
\b(?:a|the|one) reasons? (?:for|of)\b
Или использовать группу захвата, если вы хотите, чтобы слова в группе:
\b(a|the|one) (reasons?) (for|of)\b
\bone\b \breason\b
как одну часть. regex101.com/r/gD4nI3/1
– Kasramvd
29 August 2015 в 09:03