Может быть сложным, когда обратные слэши повторяются много раз, например: \\\\\\\\\\\\\\(p:1)
. Вам нужно знать, является ли количество обратных косых черт четным или нечетным, чтобы узнать, экранирован ли (
или нет.
Во-вторых, двоеточие, встречающееся в скобках, также может быть экранировано и не будет учитываться (?).
Поэтому я бы предложил работать с чем-то вроде (?:\\.|[^:)\\])*
, которое имеет дело с экранированными символами (.
) и предъявляет некоторые требования к неэкранированным символам, например [^:)\\]
.
Итак, это результат:
(?<!\\)(?:\\.)*\((?:\\.|[^:)\\])*:(?:\\.|[^:)\\])*\)
При этом используется поиск, который поддерживается в последних версиях популярных браузеров.
Если поиск не возможен, захватите символ, который предшествует потенциальному обратному слешу, и создайте группу захвата для нужной вам части:
(?:[^\\]|^)((?:\\.)*\((?:\\.|[^:)\\])*:(?:\\.|[^:)\\])*\))
Так что здесь вам нужно поработать с первой захваченной группой.