Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Помогите написать регулярку (https://javascript.ru/forum/misc/30828-pomogite-napisat-regulyarku.html)

starjons 17.08.2012 12:23

Помогите написать регулярку
 
Здравствуйте. Прошу помочь с регуляркой.
Есть строка типа: ........alt=1_2|176_2|175_1|.....
я ищу а есть ли в этой строке элементы с определенным индексом после подчеркивания, то есть создаю такой шаблон:
var str = '_' + (index+1) + '|'; //динамически создаваемое значение типа _2|
regex = new RegExp(str+'/');

а далее, если в этой строке есть такое вхождение(-ия), то их нужно найти и заменить на число, скажем Х
вот и я пишу
regNew = new RegExp('(\d+|alt=\d+)'+str+'/');
foundInCookie = forOpenList.match(regNew);

НО ОН УПОРНО НИЧЕГО НЕ НАХОДИТ!! Прошу помочь...:help:

nerv_ 17.08.2012 13:10

больше обратных слешей: \d -> \\d

FINoM 08.05.2014 21:28

Не хотелось создавать новой темы, сорри за воскрешение поста, она вроде как подходит моей проблеме.

Что-то я немножечко туплю. Подскажите, как разбить строку на пробелы так, чтоб пробелы не учитывались в скобках:
'vasia(petia   grisha) grisha( petia vasia) petia(vasia grisha )'

На выходе должен получиться такой массив:
['vasia(petia   grisha)', 'grisha( petia vasia)', 'petia(vasia grisha )']


В голову лезут страшные решения: например, разбить строку сплитом по пробелам и в цикле воссоединить содержимое скобок. Уверен, есть решения по-адекватнее.

Спасибо.

Erolast 08.05.2014 21:59

var str = 'vasia(petia   grisha) grisha( petia vasia) petia(vasia grisha )';
var result = str.match(/\S*?\(.*?\)/g);


Примерно так. Шаблон подправить под реально возможные варианты строки.

nerv_ 08.05.2014 22:10

Цитата:

Сообщение от FINoM
Подскажите, как разбить строку на пробелы так, чтоб пробелы не учитывались в скобках

В данном случае, с точки зрения регулярных выражений, проще вытащить то, что требуется по шаблону. Например, так:
alert('vasia(petia   grisha) grisha( petia vasia) petia(vasia grisha )'.match(/[^(]+\([^)]*\)/g));

Aetae 09.05.2014 02:51

Как то так. Но тут есть подводные камни.)
<script>alert(
    'vasia(petia   grisha) grisha( petia vasia) petia(vasia grisha )'
    .split(/\s(?![^(]*\))/g)
.join('\n'));</script>

FINoM 20.05.2014 15:17

Спасибо всем огромное.

FINoM 03.09.2014 18:03

С регулярками у меня всё лучше, но, порой, возникают проблемы, которые не могу понять, как решить. Нужно извлечь содержимое скобок из строки:
'(:not(.hide))'.replace( /\(([^\(\)]*)\)/, '$1' ); //":not(.hide)"

Работает верно, но, если добавить что-то перед строкой, результат будет не таким, как ожидаю:
'xxx(:not(.hide))'.replace( /.*\(([^\(\)]*)\)/, '$1' ); //".hide)"

Как извлечь содержимое скобок из второго примера?
Псевдопаттерн:
строка(содержимое)


Спасибо.

Aetae 03.09.2014 18:12

Что-то ты мудришь:):
alert(
    'xxx(:not(.hide))'.replace( /^.*?\((.*)\)/, '$1' )
)


Кстати
'(:not(.hide))'.replace( /\(([^\(\)]*)\)/, '$1' ); //":not(.hide)"
вовсе не ":not(.hide)", а "(:not.hide)"

FINoM 03.09.2014 18:16

Aetae, спасиб, не могу плюсик поставить.
Цитата:

Сообщение от Aetae
вовсе не ":not(.hide)", а "(:not.hide)"

Точно, перепутал регулярки, которые пробовал.


Часовой пояс GMT +3, время: 22:56.