Ваше регулярное выражение должно быть выражено до
/(.*)\sCO\s?(\(.+\).*|".+".*|'.+'.*|{.+}.*|\[.+\].*)/
(.*)
Первая группа захвата захватит начальную группу («3M» в вашем примере)
\sCO\s
Затем ищет пробел, за которым следует CO
, за которым следует пробел
(".+".* etc.)
Вторая группа захвата, которая ищет начальную кавычку или скобку, за которой следует хотя бы один символ чего-либо, за которым следует закрывающая кавычка, а затем любое число любого символа
Почему оригинальное регулярное выражение не сработало
В исходном регулярном выражении [\(.*\)|\[.*\]|\{.*\}|''.*''|".*"]
можно упростить до [''.*'']
(для предоставленной вами строки). Я понимаю, что для других строк вы можете искать (.*)
или [.*]
или {.*}
или ".*"
, но для строки "3M" важна только [''.*'']
, поэтому мы просто посмотрим на это.
Таким образом, [''.*'']
просто означает: сопоставить любой символ в списке внутри []
в любом порядке. В этом случае в списке три уникальных символа: '
, .
и *
(хотя вы повторили '
3 раза). Так что это соответствует первому '
. Но поскольку это совпадение находится за пределами вашей группы захвата ()
, то это первое '
не включается в ответ вашей группы захвата.
Таким образом, следующее совпадение с (.*)
соответствует всему остальному, что идет после первого '
, и включает их во вторую группу сопоставления, то есть A'(MINNESOTA MINING AND MANUFACTURING COMPANY)
без '
впереди.
Имеет ли это смысл?
Демо
Если вы хотите убедиться, что формат включает 'A'
или [A]
или "A"
или {A}
или (A)
, то это то, что вы хотите:
let regex = /(.*)\sCO\s?(\(.+\)|".+".*|'.+'.*|{.+}.*|\[.+\].*)/;
[pattern, match1, match2] = "3M CO 'A'(MINNESOTA MINING AND MANUFACTURING COMPANY)".match(regex);
console.log(match1 + " CO " + match2);
//3M CO 'A'(MINNESOTA MINING AND MANUFACTURING COMPANY)
[pattern, match1, match2] = '3M CO (A)(MINNESOTA MINING AND MANUFACTURING COMPANY)'.match(regex);
console.log(match1 + " CO " + match2);
//3M CO (A)(MINNESOTA MINING AND MANUFACTURING COMPANY)
[pattern, match1, match2] = '3M CO "A"(MINNESOTA MINING AND MANUFACTURING COMPANY)'.match(regex);
console.log(match1 + " CO " + match2);
//3M CO "A"(MINNESOTA MINING AND MANUFACTURING COMPANY)
[pattern, match1, match2] = "3M CO [A](MINNESOTA MINING AND MANUFACTURING COMPANY)".match(regex);
console.log(match1 + " CO " + match2);
//3M CO [A](MINNESOTA MINING AND MANUFACTURING COMPANY)
[pattern, match1, match2] = "3M CO {A}(MINNESOTA MINING AND MANUFACTURING COMPANY)".match(regex);
console.log(match1 + " CO " + match2);
//3M CO {A}(MINNESOTA MINING AND MANUFACTURING COMPANY)