Можно ли объединить вопросы по регулярным выражениям ([\ \ d] * $) и ([\\ d] *) c $ - PullRequest
0 голосов
/ 11 августа 2009

У меня есть два простых вопроса о регулярных выражениях.

Имея строку $10/$50, я хочу получить 50, которая всегда будет в конце строки. Итак, я сделал: ([\\d]*$)

Имея строку 50c/70c Я хочу получить 70, который всегда будет в конце строки (я хочу его без c), поэтому я сделал: ([\\d]*)c$

Кажется, что оба делают то, что я хочу, но на самом деле я хотел бы сделать с ним 2 вещи:

  • а) Я хотел бы надеть оба одинаковых Строка (это возможно?). Я пробовал с | но, похоже, это не сработало.
  • ** б) ** Если это действительно возможно, а), я хотел бы знать, возможно ли отформатировать текст Как видите, оба за доллары и центы я буду получить с помощью регулярного выражения значение, которое показывает строка Но пока в первом случае мы имеем дело с долларов, во втором мы имеем дело с центами, поэтому я хотел бы преобразовать 50 центов на 0,5. Это возможно, или я должен буду кодировать это сам?

Ответы [ 6 ]

5 голосов
/ 11 августа 2009

Для сопоставления обоих случаев вы в основном говорите, что «с» является необязательным. Тогда используйте "?" что означает «ноль или одно совпадение предыдущего символа». Это должно дать вам следующее:

([\d]*)c?$

Надеюсь, это поможет.

3 голосов
/ 11 августа 2009

(а) легко:

(\d+)c?$

(б) вы не можете делать с регулярными выражениями.

2 голосов
/ 11 августа 2009

Ваши регулярные выражения могут быть упрощены:

([\d]*$)        ([\d]*)c$

вам не нужны квадратные задники

(\d*$)          (\d*)c$

Но я бы порекомендовал вам требовать, чтобы в вашем номере была хотя бы цифра, поэтому используйте + вместо *

(\d+$)          (\d+)c$

Теперь вы можете объединить их вместе:

(\d+)(c?)$

Я бы не рекомендовал делать вычисления внутри регулярного выражения. Мы взяли 'c' во второй скобке, чтобы мы могли работать с этой информацией. Вот как все это выглядело бы в Perl, пожалуйста, измените его соответствующим образом:

if( m/(\d+)(c?)$/ ) {

   if( $2 eq 'c' ) {
       $dollars = $1/100;
   } else {
       $dollars = $1;
   }

   print "$_ are $dollars dollars\n"

}

Как я прокомментировал выше: calculatino может быть сделано в регулярном выражении / подстановке

s/.*?(\d+)(c?)$/$1*($2?0.01:1)/e 

но это может быть немного запутано

2 голосов
/ 11 августа 2009

(\ $? [\ D] +) с

Следующие совпадения будут совпадать в одном попадании из абзаца. Используйте следующий инструмент, чтобы увидеть в следующем примере текст

http://gskinner.com/RegExr/

Пример текста

Это строка 50c / 70c $ 10 / $ 50

Это строка 50c / 70c $ 9 / $ 50 Это строка 50c / 70c $ 8 / $ 50

Это строка 50c / 70c $ 7 / $ 50

Это строка 50c / 70c $ 6 / $ 50

Это строка 50c / 70c $ 5 / $ 50

2 голосов
/ 11 августа 2009

При условии, что это регулярные выражения в стиле Perl (на самом деле я не знаю C # /. Net):

(\d+(?=c$)|(?<=\$)\d+$)

Форматирование текста, вероятно, будет чем-то, что нужно делать вне соответствия регулярному выражению.

0 голосов
/ 11 августа 2009

Другие отметили, что (\ d +) (c?) $ Удовлетворяет a).

Но я не вижу причин, по которым вы не можете выполнить форматирование с помощью операторов подстановки:

s/(\d)0c/0,$1/
s/(\d\d)c/0,$1/
s/(\d)c/0,0$1/
...