john1990_1 Ответов: 1

В регулярном выражении, как записать совпадение наименьшего числа повторений?


У меня есть программа, которая говорит текст:

Преобразование Текста В Речь Для Windows[^]

Я хочу, чтобы регулярное выражение обнаруживало такие источники, как

(Lee & others, 2012)


или

(Lee & others, 2012a)




В тексте, чтобы пропустить их произнесение.

Что я уже пробовал:

Я пробовал это регулярное выражение, но оно плохо работает...

*?\,\з\д\д\д\д([А-Д]?)\)"

Я хочу, чтобы часть .*? была заменена чем-то, что говорит наименьшее количество повторений, поэтому я не получаю обычный текст невысказанным, вы знаете, что мое регулярное выражение иногда пропускает от первой открытой скобки первого источника ко второй открытой скобке второго источника. второй источник.

Часть .*? не жадная, но я все равно получаю много повторений, я хочу как можно меньше повторений между 2 скобками.

1 Ответов

Рейтинг:
9

OriginalGriff

Я думаю, вам нужно это проверить: когда я попробую ваше регулярное выражение в Expresso или простом приложении:

string input = @"I want a Regex to detect sources like (Lee & others, 2012) I want a Regex to detect sources like (Lee & others, 2012) I want a Regex to detect sources like (Lee & others, 2012)";
string output = Regex.Replace(input, @"\(.*?\,\s\d\d\d\d([a-d]?)\)", "%%");
Console.WriteLine(output);
Я получаю именно то, что ожидаю, а вы просите:
I want a Regex to detect sources like %% I want a Regex to detect sources like %% I want a Regex to detect sources like %%
То есть он правильно распознает каждую пару скобок ("%%"есть только для того, чтобы вы могли видеть, что было удалено - он также отлично работает с"").

Поэтому взгляните на свои образцы данных и попробуйте сократить их до тех пор, пока у вас не будет минимального подмножества, которое все еще отображает проблему - это может быть не то, что вы думаете!

- Не могли бы вы примерить вот это:

и ее коллеги
(2013) использовали углеродное датирование для измерения
рост новых нейронов в мозге
люди в возрасте от 19 до 92 лет. Более 50 лет
назад, наземные испытания ядерных бомб
выброс углерода-14, или с-14, в атмосферу. Поскольку эти ядерные испытания были
запрещенные в 1963 году уровни с-14 в атмосфере снижались с регулярной и
хорошо известная ставка. Таким образом, измерение концентрации с-14 в нейронах
обеспечил” отметку времени " для нейронов, позволив исследователям определить, когда
нейроны были сгенерированы.
Сигнатура углерода-14 была безошибочной: Сполдинг и ее коллеги обнаружили
явные доказательства нейрогенеза после рождения и, по сути, на протяжении всей жизни. Они
также удалось вычислить скорость нейрогенеза в определенной области мозга,
называется гиппокамп, область мозга, участвующая в обучении и памяти. Он повернулся
оказалось, что в среднем каждый день генерируется 1400 новых нейронов. Ставка
с возрастом она лишь немного уменьшилась. Другие области мозга, однако, не проявлялись.
доказательства нейрогенеза.
Исследования нейрогенеза у людей и животных выявили ряд
интригующие находки. В настоящее время общепризнано, что новорожденные нейроны развиваются в
зрелые функционирующие нейроны, по крайней мере, в двух областях человеческого мозга-гиппокампе
и обонятельная луковица, отвечающая за восприятие запаха (Lee &others, 2012).
Эти вновь созданные"


Что ж, это тоже работает - он устраняет все, что находится между первой открытой скобкой и первой закрытой скобкой после запятой и пробела, - что именно вы и сказали ему сделать!
Один из способов решить эту проблему - использовать балансировочные группы - которые я *не * собираюсь объяснять: смех: - и попытаться удалить все, что находится внутри скобок, которые заканчиваются четырьмя цифрами:
\((?>\((?<c>)|[^()]+|\)(?<-c>))*(?(c)(?!))\d{4}\)

Но... регулярное выражение, вероятно, является неправильным подходом - вам может понадобиться более сложный процессор естественного языка, или вы, возможно, пропустите некоторые крайние случаи.

Я бы посоветовал вам получить копию Экспрессо[^]- это бесплатно, и он исследует и генерирует регулярные выражения.

- Я использую Эспрессо, извините, регулярное выражение, которое вы дали, вообще не работает..."

: doh: я пропустил, что он захватил первый (2013), но не второй ... были ли цифры в неправильном месте :O
Попробовать это:
\((?>\((?<c>)|[^()]*\d{4}|\)(?<-c>))*(?(c)(?!))\)
Что должно охватить оба случая. Прости за это ...

- Простите, я не совсем понял. Трудно ли вам обойтись без объяснения: добавление возможности 1 буквы после номера года? Когда-то я работал с регулярными выражениями и группами, но сейчас они не нужны..."

Попробуй:
\((?>\((?<c>)|[^()]*\d{4}[a-zA-Z]?|\)(?<-c>))*(?(c)(?!))\)


john1990_1

Не могли бы вы примерить вот это:

и ее коллеги
(2013) использовали углеродное датирование для измерения
рост новых нейронов в мозге
люди в возрасте от 19 до 92 лет. Более 50 лет
назад, наземные испытания ядерных бомб
выброс углерода-14, или с-14, в атмосферу. Поскольку эти ядерные испытания были
запрещенные в 1963 году уровни с-14 в атмосфере снижались с регулярной и
хорошо известная ставка. Таким образом, измерение концентрации с-14 в нейронах
обеспечил” отметку времени " для нейронов, позволив исследователям определить, когда
нейроны были сгенерированы.
Сигнатура углерода-14 была безошибочной: Сполдинг и ее коллеги обнаружили
явные доказательства нейрогенеза после рождения и, по сути, на протяжении всей жизни. Они
также удалось вычислить скорость нейрогенеза в определенной области мозга,
называется гиппокамп, область мозга, участвующая в обучении и памяти. Он повернулся
оказалось, что в среднем каждый день генерируется 1400 новых нейронов. Ставка
с возрастом она лишь немного уменьшилась. Другие области мозга, однако, не проявлялись.
доказательства нейрогенеза.
Исследования нейрогенеза у людей и животных выявили ряд
интригующие находки. В настоящее время общепризнано, что новорожденные нейроны развиваются в
зрелые функционирующие нейроны, по крайней мере, в двух областях человеческого мозга-гиппокампе
и обонятельная луковица, отвечающая за восприятие запаха (Lee &others, 2012).
Эти вновь созданные

OriginalGriff

Ответ обновлен

john1990_1

Я сделал это с помощью "за" и отсканировал текст, и он, кажется, работает, хотя я был бы рад увидеть ответ...

john1990_1

Я использую Expresso, извините, регулярное выражение, которое вы дали, вообще не работает...

OriginalGriff

Ответ обновлен

john1990_1

thx это работает, но и источники иногда имеют такую букву:
(Lee &others, 2012a)

OriginalGriff

: смейтесь: видите, что я имею в виду под "крайними случаями"?

OriginalGriff

Лучше всего, вероятно, использовать регулярное выражение и "интеллектуальную обработку": вы можете использовать регулярное выражение, чтобы определить только скобки и извлечь содержимое, а затем обработать содержимое, чтобы увидеть, выглядит ли оно как ссылка или "естественный английский".
Это довольно просто: замените "*\d{4} "на"+", и он будет соответствовать скобкам. Это постобработка, которая становится сложной, и это лучше всего не делать в регулярном выражении, которое вы хотите понять через шесть месяцев, когда найдете новый крайний случай!

john1990_1

Простите, я не совсем понял.
Трудно ли вам обойтись без объяснения: добавление возможности 1 буквы после номера года? Когда-то я работал с регулярными выражениями и группами, но сейчас они не нужны...

OriginalGriff

Ответ обновлен