2012-10-15 2 views
3

Я использую следующее регулярное выражение, чтобы соответствовать всем словам:Regex чтобы соответствовать всем словам, за исключением тех, в скобках - JavaScript

mystr.replace(/([^\W_]+[^\s-]*) */g, function (match, p1, index, title) {...} 

Обратите внимание, что слова могут содержать специальные символы, такие как немецких умляуты. Как я могу совместить все слова, исключая их в круглых скобках?

Если у меня есть следующая строка:

here wäre c'è (don't match this one) match this 

Я хотел бы получить следующий вывод:

here 
wäre 
c'è 
match 
this 

Задние пространства не имеет никакого значения. Есть ли простой способ добиться этого с помощью регулярного выражения в javascript?

EDIT: Я не могу удалить текст в круглых скобках, так как заключительная строка «mystr» также должна содержать этот текст, тогда как операции с строкой будут выполняться с текстом, который соответствует. Заключительная строка, содержащаяся в «mystr» может выглядеть следующим образом:

Here Wäre C'è (don't match this one) Match This 
+1

Я не думаю, что это возможно с помощью одного regex, возможно, вам сначала нужно вырезать круглые скобки. –

+0

Вам нужно учитывать вложенные (например, это (или даже это)) круглые скобки? Если это так, вам придется наложить верхнюю границу вложенности или перейти к решению, не основанному на RE. – Vatine

+0

Не нужно учитывать вложенные круглые скобки. Может быть несколько родительских, но они не будут вложенными. например »(вроде этого) и как (это)« – thomasf

ответ

4

Попробуйте это:

var str = "here wäre c'è (don't match this one) match this"; 

str.replace(/\([^\)]*\)/g, '') // remove text inside parens (& parens) 
    .match(/(\S+)/g);   // match remaining text 

// ["here", "wäre", "c'è", "match", "this"] 
+0

BTW, parens не имеют значения в символьном классе, поэтому их не нужно экранировать - '[^)]' отлично. То же самое касается любого другого метасимвола. – Tomalak

+0

да, действительно. Я всегда избегаю особых персонажей как личную привычку, даже если это не нужно. – fcalderan

+0

Спасибо, Фабрицио, но я не был достаточно конкретным в своем вопросе. Я не могу удалить строку в круглых скобках, так как вся строка, включая текст в круглых скобках, должна быть возвращена, пока в матчах будут выполняться строковые операции. – thomasf

1

Томас, воскрешая этот вопрос, потому что это было простое решение, которое не было упомянуто, и что Безразлично» t требуется заменить то сопоставление (один шаг вместо двух шагов). (Найдено на ваш вопрос, делая некоторые исследования для общего вопроса о how to exclude patterns in regex.)

Вот наш простой регулярное выражение (см на работе on regex101, глядя на группу захватывает в нижней правой панели):

\(.*?\)|([^\W_]+[^\s-]*) 

Левая часть чередования соответствует завершению (parenthesized phrases). Мы проигнорируем эти матчи. Правая сторона сопоставляет и захватывает слова в группу 1, и мы знаем, что они правильные слова, потому что они не соответствовали выражению слева.

Эта программа показывает, как использовать регулярные выражения (см матчи в online demo):

<script> 
var subject = 'here wäre c\'è (don\'t match this one) match this'; 
var regex = /\(.*?\)|([^\W_]+[^\s-]*)/g; 
var group1Caps = []; 
var match = regex.exec(subject); 

// put Group 1 captures in an array 
while (match != null) { 
    if(match[1] != null) group1Caps.push(match[1]); 
    match = regex.exec(subject); 
} 

document.write("<br>*** Matches ***<br>"); 
if (group1Caps.length > 0) { 
    for (key in group1Caps) document.write(group1Caps[key],"<br>"); 
    } 

</script> 

Reference

How to match (or replace) a pattern except in situations s1, s2, s3...

+0

, пожалуйста, не могли бы вы помочь мне с этим http://stackoverflow.com/questions/23797093/regex-email-validation-that-allows-only-hyphens-in-the-middle-of-the-domain-and – Axel

Смежные вопросы