Просто чтобы расширить комментарий Тиброгаргана , вы можете определить такие случаи:
let input = "OOP is a programing concept. Objects are instances Of O classes"
let regex = /((?<!\.\s{1,2})(?<=\s)O(?=\s))/g
let output = input.replace(regex,'0')
console.log(output)
RegExp Groups
При этом используется два типа групп : негативный вид сзади и позитивный взгляд и позитивный взгляд . Их целесообразно называть группами обхода , поскольку они позволяют оценивать символы по обе стороны от основной строки, не становясь частью совпадения.
С отрицательным взглядом сзади, если значения, содержащиеся в (?<!VALUES_HERE)
, найденные до следующего выражения вне скобок, будут отклонять совпадение.
Backsla sh в выражении \.
предназначено для экранирования периода, поскольку точки являются частью синтаксиса RegEx. \s
представляет один пробел, но следующие квадратные скобки являются квантификаторами, которые указывают, что выражение будет распознавать от 1 до 2 экземпляров пробела.
Принимая во внимание, что с положительным предвидением и lookbehind, если выражение, содержащееся в предпросмотре form (?=VALUES_HERE)
или lookbehind form (?<=VALUES_HERE)
match и выражения до или после (соответственно), тогда оно будет возвращать только основное выражение, а не lookahead или lookbehind.
Почему так?
Написанное так, выражение выбрасывает все совпадения, которые имеют точку с пробелом или два перед «О». Он ищет до двух пробелов, потому что мы знаем, что здесь вводится OCR, который иногда может искажать один пробел.
Если бы ключевое слово было собственно существительным, это выражение было бы сложнее составить, так как слово будет продолжать появляться с заглавными буквами по всему предложению, что здесь не так.
Он будет принимать в качестве совпадения любое «O», которое имеет один пробел с обеих сторон, предотвращая случайное совпадение слов, которые начинаются с большой буквы "O".
См. живое выражение на RegExr.
Дополнительная литература