【问题标题】:Find uppercase O inside sentence, but not in beginning在句子内查找大写 O,但不在开头
【发布时间】:2020-08-05 01:36:46
【问题描述】:

我需要在句子中替换大写的O,但应该在句子的开头保留O。

所以我只需要在句子中找到并匹配唯一的O。

例如:

OOP is a programing concept. Objects are instances Of O classes
                             ↑                        ↑
                           corect                   replace

Objects 中的 O 在句子开头正确大写。它还应该注意不匹配行开始本身。 'O classes' 中的第二个 O 应该是数字 ZERO 0 表示数量。我需要的正则表达式是匹配那个。

我知道如何匹配任何 O,但它也会匹配第一个。有什么线索吗?

【问题讨论】:

  • 这匹配你给出的一个例子:(?<!\. )O 但它只匹配句号后的一个空格

标签: regex


【解决方案1】:

只是为了扩展Tibrogargan's comment,您可以像这样识别案例:

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)

正则表达式组

这使用two types of groups:消极的后视和积极的前瞻和积极的后视。这些被称为 lookaround groups 很有用,因为它们让您可以评估主字符串两侧的字符,而不会成为匹配项本身的一部分。

使用否定的lookbehind,如果(?&lt;!VALUES_HERE)包含的值在括号外的以下表达式之前找到,它将拒绝匹配。

表达式\. 中的反斜杠用于转义句点,因为句点是RegEx 语法的一部分。 \s 表示一个空格,但以下括号是量词,指定表达式将识别 1 到 2 个空格实例。

然而,对于正向前瞻和后向,如果前瞻形式(?=VALUES_HERE) 或后向形式(?&lt;=VALUES_HERE) 包含的表达式匹配和之前或之后的表达式(分别),则它只会返回主表达式,而不是前瞻或后瞻。

为什么会这样?

这样写,表达式会抛出所有在“O”之前有一个或两个空格的句点的匹配项。它最多查找两个空格,因为我们知道这里的输入来自 OCR,它有时可能会误报一个空格。

如果关键字是专有名词,则该表达式将更难组合,因为该词将继续以大写形式出现在整个句子中,而此处并非如此。

它只接受两边各有一个空格的任何“O”作为匹配项,防止意外匹配以大写“O”开头的单词。

在 RegExr 上查看 live expression。

进一步阅读

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 2014-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多