Как мне реализовать это регулярное выражение в ColdFusion (или Java)? - PullRequest
4 голосов
/ 09 сентября 2010

Я нашел это очень удобное регулярное выражение на regexlib.com, но я не знаю, как реализовать его в моем приложении.

(?:(?:(?<Feet>\d+)[ ]*(?:'|ft)){0,1}[ ]*(?<Inches>\d*(?![/\w])){0,1}(?:[ ,\-]){0,1}(?<Fraction>(?<FracNum>\d*)\/(?<FracDem>\d*)){0,1}(?<Decimal>\.\d*){0,1}(?:\x22| in))|(?:(?<Feet>\d+)[ ]*(?:'|ft)[ ]*){1}

Я протестировал егоиспользуя их онлайн-инструмент тестирования, и он действительно делает все, что мне нужно.Вставка его в качестве параметра в REFind () ColdFusion, как и ожидалось, не сработала и вернула бесполезное сообщение об ошибке.

Я работаю в ColdFusion, поэтому при необходимости имею доступ к классам Java.Ответы на Java или ColdFusion будут полезны.

Хорошая примерная строка будет выглядеть примерно так: 5 '1/2 "

EDIT

Мне нужно использовать группы в регулярном выражении, чтобы извлечь данные, а не просто использовать их для проверки строки. Я думаю, это означает, что мне следует использовать REMatch ()? Пожалуйста, извините, что у меня нет опыта работы с регулярным выражением!

РЕДАКТИРОВАТЬ 2

Кажется, что использование REFind () с этим выражением:

(?:(?:(\\d+)[ ]*(?:'|ft)){0,1}[ ]*(\\d*(?![/\\w])){0,1}(?:[ ,\\-]){0,1}((\\d*)\\/(\\d*)){0,1}(\\.\\d*){0,1}(?:\\x22| in))|(?:(\\d+)[ ]*(?:'|ft)[ ]*){1}

не находит совпадений для большинства тестовых данных, которые я предоставляюэто, включая те, которые возвращают совпадения с помощью тестера regexlib.com: 1ft 2-3/4 in, 2' 3 4/5", 3ft, 4', 5 in, 6", 7.125 in, 3ft 4.5 in

Ответы [ 3 ]

4 голосов
/ 09 сентября 2010

Синтаксис? не поддерживается в ColdFusion. Я не знаком с этим синтаксисом, но похоже, что он используется для присвоения имен захваченным подвыражениям. Например, первое подвыражение - это число, представляющее ноги, поэтому оно имеет тег? . Вы можете удалить эти теги, не влияя на то, что соответствует регулярному выражению.

Я не проверял его, но все остальные элементы, которые я вижу в этом регулярном выражении, поддерживаются в ColdFusion, поэтому REFind () должен работать после удаления всех тегов? . Доступ к подвыражениям, конечно же, поддерживается с помощью аргумента returnubexpressions. См. Стандартные документы CF на REFind ().

Кроме того, регулярное выражение кажется немного многословным. {0,1} редко, как? означает то же самое. {1} еще реже, так как он используется по умолчанию для группировок и поэтому может быть полностью опущен.

ДОПОЛНЕНИЕ

regex = "(?:(?:(\\d+)[ ]*(?:'|ft)){0,1}[ ]*(\\d*(?![/\\w])){0,1}(?:[ ,\\-]){0,1}((\\d*)\\/(\\d*)){0,1}(\\.\\d*){0,1}(?:\\x22| in))|(?:(\\d+)[ ]*(?:'|ft)[ ]*){1}";
subs = REFind(regex,input,1,"True");
if (subs.pos[1] eq 0) {
  found = "False";
} else {
  found = "True";
  feet = Mid(input,subs.pos[2],subs.len[2]);
  inches = Mid(input,subs.pos[3],subs.len[3]);
  fraction = Mid(input,subs.pos[4],subs.len[4]);
  fracNum = Mid(input,subs.pos[5],subs.len[5]);
  fracDem = Mid(input,subs.pos[6],subs.len[6]);
  decimal = Mid(input,subs.pos[7],subs.len[7]);
  if (feet is "") {
    // Use the _other_ feet
    feet = Mid(input,subs.pos[8],subs.len[8]);
  }
}
1 голос
/ 09 сентября 2010

Похоже, что ваше выражение было в синтаксисе C #, который поддерживает именованные группы (например, (?<Decimal>\.\d*)). Java этого не делает, и рассматривает их как нечто совершенно иное. Поскольку именованные группы в любом случае не используются, это просто вопрос удаления именующей части (например, (?<Decimal>\.\\d*) становится (\.\\d*)).

Pattern.compile("(?:(?:(\\d+)[ ]*(?:'|ft)){0,1}[ ]*(\\d*(?![/\\w])){0,1}(?:[ ,\\-]){0,1}((\\d*)\\/(\\d*)){0,1}(\\.\\d*){0,1}(?:\\x22| in))|(?:(\\d+)[ ]*(?:'|ft)[ ]*){1}");
0 голосов
/ 09 сентября 2010

Java String объект поддерживает регулярные выражения. Sting.match (), String.replaceAll () и String.replaceFirst ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...