Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.05.10;
Скачать: CL | DM;

Вниз

Regular Expression   Найти похожие ветки 

 
Mephisto   (2009-03-05 11:55) [0]

не получается написать регулярное выражения которое бы из строки
"a1 a2 a3 a4 a5" извлекало все числа. Делаю так:
"\w(\d)" извлекается только первое число. Помогите исправить


 
palva ©   (2009-03-05 12:11) [1]

Этот вопрос не решается написанием правильного выражения. Нужно указание дополнительных параметров. А это зависит от движка, который вы используете, но о котором не говорите.

> "\w(\d)" извлекается только первое число.

Это не так. Извлекается слово, за которым следует цифра, т. е. никак не число.


 
test ©   (2009-03-05 12:14) [2]

Используй не жадный поиск, по умолчанию используется жадный(первое вхождение и выходим) в библиотеке указывается не жадный поиск(сколько найдем все наше) и задачка решена.


 
antonn ©   (2009-03-05 12:45) [3]


> извлекало все числа

каким образом "извлекало"? оставляя числа на своих местах или возвращала из строки только встречающиеся символы?
если последнее то есть вариант просто удалить все не числа, с первым - оставляя пробельные символы:
$text="a1 a2 a3 a4 a5 12";

function get_num($a) {
return preg_replace("/[^0-9]/", "", $a);
}

function get_num_space($a) {
return preg_replace("/[^0-9\s]/", " ", $a);
}
echo get_num($text)."<br>";
echo get_num_space($text);


 
test ©   (2009-03-05 12:56) [4]

Возможно еще проблема в (\d) что соответствует (\d{1}), то есть выбрать одну цифру, используй (\d+) выбрать все цифры или укажи явно сколько цифр хочеш получить, например (\d{4}) выбрать ровно 4 числа в строке или (\d{1,4}) выбрать от одной до четырех цифр в строке


 
antonn ©   (2009-03-05 13:13) [5]


> test ©   (05.03.09 12:56) [4]

это в дельфи такие регулярки? ужас... в PCRE \d{4} будет искать 4 цифры идущие подряд


 
NieL ©   (2009-03-05 13:16) [6]

Если используешь vbscript.dll то можно так:


procedure Tfrm_RegEx.btn_ExecuteClick(Sender: TObject);
var
 i     : Integer;
 MC    : MatchCollection;
 RegExp: TRegExp;
begin
 RegExp := TRegExp.Create(nil);
 with RegExp do
   try
     Pattern := "\s*\w(\d)";
     IgnoreCase := True;
     Global := True;
     MC := Execute("a1 a2 a3 a4 a5")
       as MatchCollection;
     for i := 0 to mc.Count - 1 do
       ShowMessage(((MC[i] as Match).SubMatches as SubMatches)[0]);
 finally
   RegExp.Free;
 end;
end;


 
test ©   (2009-03-05 13:19) [7]

antonn ©   (05.03.09 13:13) [5]
Я так и написал
4 числа в строке == 4 цифры идущие подряд


 
antonn ©   (2009-03-05 13:25) [8]


> test ©   (05.03.09 13:19) [7]
>
> antonn ©   (05.03.09 13:13) [5]
> Я так и написал
> 4 числа в строке == 4 цифры идущие подряд

!=
выбрать ровно 4 числа в строке
:)


 
test ©   (2009-03-05 13:26) [9]

antonn ©   (05.03.09 13:25) [8]
Не придерайся к каждому слову и запятым, а то работать тут роботом по проверки орфаграфии порекомендую тебя администрации ))


 
antonn ©   (2009-03-05 13:29) [10]

ну блин, смысл то совсем другой получился, почему я и удивился (удивился, а не ехидно сделал замечание! :)), регулярки не прощают вольностей в трактовании %)


 
Anatoly Podgoretsky ©   (2009-03-05 13:30) [11]

> test  (05.03.2009 13:19:07)  [7]

Это неверное определение, это одно число.


 
test ©   (2009-03-05 13:33) [12]

antonn ©   (05.03.09 13:29) [10]
Anatoly Podgoretsky ©   (05.03.09 13:30) [11]
Не то слово написал, бывает блин


 
Медвежонок Пятачок ©   (2009-03-05 13:38) [13]

with TRegExpr.Create do
 try
  Expression  := "\w(\d)";
  InputString := "a1 a2 a3 a4 a5";
  i := 1;
  if Exec(i) then
   while Exec(i) do
    begin
     ShowMessage(Match[1]);
     i := succ(MatchPos[1]);
    end;
 finally
  Free;
 end;


 
palva ©   (2009-03-05 13:48) [14]


> выбрать ровно 4 числа в строке

Какие-то непонятные споры. Автору нужны числа, состоящие из ОДНОЙ цифры, перед которым стоит алфавитно-цифровой символ. Посмотрите на его регулярное выражение. Оно его устраивает за исключением того, что ему нужны ВСЕ вхождения таких чисел. Он спрашивает, как сделать поиск глобальным. Такая возможность наверняка имеется, только автор должен сообщить, на чем он пишет свое регулярное выражение. Например на JavaScript к регулярному выражению нужно приписать букву g. Положите такой скрипт в файл с расширением js и запустите его. Он последовательно выведет 1 2 3 4 5 6, что и требовалось.

s = "a1 a2 a3 a4 a5 66"
re = /\w(\d)/g
while(r = re.exec(s)) WScript.Echo(r[1])


 
Медвежонок Пятачок ©   (2009-03-05 13:53) [15]

while(r = re.exec(s)) WScript.Echo(r[1])

автор замучается смотреть на бесконечный поток единиц


 
Медвежонок Пятачок ©   (2009-03-05 13:58) [16]

Например на JavaScript к регулярному выражению нужно приписать букву g.

жадность или не жадность здесь конкретно никак не поможет


 
Медвежонок Пятачок ©   (2009-03-05 14:00) [17]

тем более что она актуальна/не актуальна когде есть * или +


 
test ©   (2009-03-05 14:02) [18]

Медвежонок Пятачок ©   (05.03.09 14:00) [17]
(\d+) вот так не жадный поиск что искать будет?


 
Медвежонок Пятачок ©   (2009-03-05 14:03) [19]

> "\w(\d)" извлекается только первое число.

Это не так. Извлекается слово, за которым следует цифра, т. е. никак не число.


Ищется ровно один символ - буква, цифра или _, за которым следует один символ - цифра


 
test ©   (2009-03-05 14:05) [20]

Медвежонок Пятачок ©   (05.03.09 14:03) [19]
Да автора давно нет, а телепатией не многие тут обладают свободно что бы четко поставить диагноз ))


 
palva ©   (2009-03-05 14:10) [21]


> Медвежонок Пятачок ©   (05.03.09 14:03) [19]

Да, это я сходу не разобрался. Потом исправился.


 
Медвежонок Пятачок ©   (2009-03-08 12:53) [22]

(\d+) вот так не жадный поиск что искать будет?

<Цитата>

такой нежадный (как и жадный) найдет непрерывную последвательность символов - цифр



Страницы: 1 вся ветка

Текущий архив: 2009.05.10;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.008 c
3-1220355857
Razrab7
2008-09-02 15:44
2009.05.10
NULL в Oracle и пустая строка в Delphi


15-1236203903
Германн
2009-03-05 00:58
2009.05.10
Welcom Page


15-1235986259
Nameziz
2009-03-02 12:30
2009.05.10
связь Программирования и Математики


15-1236182668
Denis__
2009-03-04 19:04
2009.05.10
Бэкапы?


9-1179259096
DevilDevil
2007-05-15 23:58
2009.05.10
Повернуть спрайт вокруг произвольной точки