Я пытаюсь создать регулярное выражение для распознавания английских цифр, такие как один, девятнадцать, двадцать, сто двадцать два, и так далее вплоть до миллионов. Я хочу повторно использовать некоторые части регулярного выражения, поэтому регулярное выражение строится по частям, например:
// replace <TAG> with the content of the variable
ONE_DIGIT = (?:one|two|three|four|five|six|seven|eight|nine)
TEEN = (?:ten|eleven|twelve|(?:thir|for|fif|six|seven|eigh|nine)teen)
TWO_DIGITS = (?:(?:twen|thir|for|fif|six|seven|eigh|nine)ty(?:\s+<ONE_DIGIT>)?|<TEEN>)
// HUNDREDS, et cetera
Мне было интересно, сделал ли кто-нибудь то же самое (и хотел бы поделиться), так как эти регулярные выражения довольно длинные и, возможно, в них есть что-то, чего не должно быть, или что-то, что я могу упустить. Кроме того, я хочу, чтобы они были максимально эффективными, поэтому я с нетерпением жду любых советов по оптимизации. Я использую механизм регулярных выражений Java, но приемлем любой вариант регулярных выражений.
Lingua::EN::FindNumber
оптимизировано за счет исключения общих префиксов и суффиксов. Строки причудливые непонятные вызываютwords2nums
для каждую найденную числовую фразу, повторно вставляя все конечные пробелы, съеденныеwords2nums
. 13.08.2009