Модераторы: ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите с регуляркой, или как исключать пары кавычек 
:(
    Опции темы
zomber
Дата 11.12.2011, 02:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 7.5.2011

Репутация: нет
Всего: нет



есть текст 
в нем надо найти все подстроки соответствующие шаблону

1) знак ":"
2) любое количество буквоцифровых символов или "_"
3) любой символ не относящийся к 2)

примерно так

":\w+\W"

только последний "\W" не надо включать в результат, а я не знаю как это делается

но! 
есть еще одно условие

если эта группа находится внутри одинарных или двойных кавычек
то данная группа не должна находится, всё что внутри кавычек должно игнорироваться

пример.

"123+':xxx' +:zzz_1*( 999 )"

на выходе должна возвращаться одна строка  ":zzz_1"

/**/

PS в заключение хочу отменить, что использовать выражение планируется в Java
но хотелось бы чтобы выражение было универсальным
подходящим как для Perl, так и для Java

Заранее благодарен


PM MAIL   Вверх
dixoNICH
Дата 11.12.2011, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 222
Регистрация: 20.3.2011

Репутация: нет
Всего: нет



Код

open f, "1.txt";
local $/ = \0;
my $p = <f>;
print "$1\n" while $p =~/[^'"](:\w+)\W[^'"]/g;

PM MAIL   Вверх
Pfailed
Дата 11.12.2011, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 6
Всего: 39



Я бы так написал: 
Код

/(?:^|[^'"])(:\w+)\W/g




--------------------
PM MAIL   Вверх
zomber
Дата 11.12.2011, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 7.5.2011

Репутация: нет
Всего: нет



судя по всему ни это, ни предыдущее не пойдет
хотя не запускал

кавычки не просто предшествующий символ
между кавычкой и : может быть любое число любых символов кроме такой же кавычки

видимо я привел неудачный пример

попробуем иначе

"123+'  qwerty :xxx asdfg' +:zzz_1*( 999 )"

вот так :xxx тоже не должно возвращаться
а :zzz_1 - должно

еще пример

"123+'  qwerty :xxx asdfg' +:zzz_1*( 999 ) '123 :yyy++ ' "

тоже самое :xxx и :yyy игнорируем
:zzz_1 возвращаем

PM MAIL   Вверх
Pfailed
Дата 11.12.2011, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 6
Всего: 39



Код

/(['"]).*?\1|(:\w*)\W/g


совпадение во второй match группе


--------------------
PM MAIL   Вверх
zomber
Дата 11.12.2011, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 7.5.2011

Репутация: нет
Всего: нет



Цитата(Pfailed @ 11.12.2011,  15:19)
Код

/(['"]).*?\1|(:\w*)\W/g


совпадение во второй match группе

не работает

Perl:

Код

$p = "  aaa 'qwqw+:qqq ' + :www_1 '' ";
print "$1\n" while $p =~/(['"]).*?\1|(:\w*)\W/g;


выводит

Код

'

'



/**/

Java:

Код

import java.util.regex.*;

public class x4
{

public static void main(String[] args)
{
  Pattern p = Pattern.compile("(['\"]).*?\\1(:\\w*)\\W");
  Matcher m = p.matcher("  aaa 'qwqw+:qqq ' + :www_1 '' ");

  while(m.find())
  {
  System.out.println(m.group());
  }
}

}


ничего не выводит

/**/

должно выводиться :www_1
а не выводится ни в одном из вариантов

PM MAIL   Вверх
Pfailed
Дата 11.12.2011, 18:12 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 6
Всего: 39



Вторая match группа это $2.
Код

while ("  aaa 'qwqw+:qqq ' + :www_1 '' " =~/(['"]).*?\1|(:\w*)\W/g) {
    if ($2) {
        print $2, "\n";
    }
}




--------------------
PM MAIL   Вверх
zomber
Дата 11.12.2011, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 7.5.2011

Репутация: нет
Всего: нет



не находит когда в конце строки

видимо правильно как-то так

/(['"]).*?\1|(:\w*)(\W|$)/g

в остальном пока работает

ЗЫ всем спасибо
PM MAIL   Вверх
Pfailed
Дата 11.12.2011, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 6
Всего: 39



Условие нужно нормально формулировать.
"Любой символ не относящийся к 2)" я понимаю как 1 символ, а у вас выходит "Любой символ не относящийся к 2) 0 или 1 раз".
/(['"]).*?\1|(:\w*)\W?/g


--------------------
PM MAIL   Вверх
alezzz
Дата 11.12.2011, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


Профиль
Группа: Участник
Сообщений: 499
Регистрация: 17.8.2009

Репутация: 11
Всего: 14



Цитата(zomber @  11.12.2011,  20:31 Найти цитируемый пост)
не находит когда в конце строкивидимо правильно как-то так/(['"]).*?\1|(:\w*)(\W|$)/g

а зачем вообще \W ? так не проще:
Код

/(['"]).*?\1|(:\w+)/g

?

после \w думаю нужен + , а то будет захватываеть двоеточия без слов.

Это сообщение отредактировал(а) alezzz - 11.12.2011, 23:51
PM MAIL   Вверх
noize
Дата 15.12.2011, 22:42 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


5.18.2
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 10.7.2010
Где: СПб

Репутация: нет
Всего: 3



(?<!['"]):\w+(?=\W)(?!['"])
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Регулярные выражения | Следующая тема »


 




[ Время генерации скрипта: 0.0601 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.