регулярное выражение, не совпадающее с пробелами в тексте между круглыми скобками

#php #regex

#php #регулярное выражение

Вопрос:

Почему это регулярное выражение не соответствует пробелам в тексте между круглыми скобками? ((?:((s>)|(s{2,})|(s))))

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

 (  R:2379; L:  28 ) //replace to (R:2379;L:28)
R:2379;L:28
(R:2432;L:28) // ok, no replacements needed
R:2432; L:28
( R  :  2475; L:    28   ) // replace to (R:2475;L:28)
R:2475; L:28
(     R : 2480   ; L:28 ) // replace to (R:2480;L:28)
R:2480; L:28
  

Редактировать:

 (  R:2379; L:  28 ) //replace to (R:2379; L:28) #a single space is ok, except before or after a parentheses. Multiple spaces are reduced to blank.
(R:2432;L:28) // ok, no replacements needed
(R:2432; L: 28) // ok, no replacements needed. The single spaces are not before or after the parentheses
( R  :  2475; L:    28   ) // replace to (R:2475; L:28) #the single space before the L is fine. other multiple spaces are blanked
(     R : 2480   ; L: 28 ) // replace to (R:2480; L: 28) #the single space before the 28 is fine
  

Комментарии:

1. В PHP для замены всех пробелов между круглыми скобками используется либо preg_replace_callback('/([^()]*)/', function ($m) { return preg_replace('/s /', '', $m[0]); }, $string) , либо preg_replace('/(?:G(?!A)|()[^()]*?Ks (?=[^()]*))/', '', $string)

2. Извините, я должен был использовать слово match не replace

3. Да, то же самое. {2,}

4. Не могли бы вы объяснить логику последнего примера? ( R : 2480 ; L: 28 ) // replace to (R:2480; L: 28) #the single space before the 28 is fine . Почему бы не сохранить отдельные пробелы с обеих сторон : ? Это одиночные пробелы.

5. Конечно, никаких проблем. Пробел перед в L порядке, и пробел перед 28 также в порядке. Я должен был упомянуть об этом при редактировании. Пробел перед ) будет заменен на ''

Ответ №1:

Вы можете использовать

 preg_replace('/(?:G(?!A)|()[^()]*?K(?:(?<=()s |s (?=))|s{2,})(?=[^()]*))/', '', $string)
  

Смотрите демонстрацию регулярных выражений. Подробные сведения:

  • (?:G(?!A)|() — либо конец предыдущего соответствия, либо (
  • [^()]*? — ноль или более символов, отличных от ( , ) , как можно меньше
  • K — опустить текст, совпадающий до сих пор
  • (?:(?<=()s |s (?=))|s{2,}) — 1 пробелы сразу после ( или 1 пробелы прямо перед ( и любые два или более пробельных символа
  • (?=[^()]*)) — за которыми следуют любые 0 или более символов, кроме ( and ) , а затем a ) .

Комментарии:

1. Можно {2,} ли оставить часть как есть?

2.@jmenezes Тогда это не даст вам ожидаемого результата, см. (?:G(?!A)|()[^()]*?Ks{2,}(?=[^()]*)) Демонстрацию.

3. Один пробел в порядке, за исключением случаев, когда этот пробел находится перед ( или ) . Вот почему я использовал три |

4. Итак, (?:G(?!A)|(s )[^()]*?Ks{2,} (?!))(?=[^()]*)) ? Смотрите демонстрацию .

5. Я имел в виду, что после a или перед a не должно быть никакого конечного пробела ( ) . Можно использовать один пробел в любом другом месте.