正则表达式中的外观和外观
#javascript #初学者 #生产率 #regex

介绍

在这篇文章中,我将谈论我学到的正式表达的可能性,但我决定分享似乎很有趣。

更具体,我将解决标题的这两个单词,乍一看听起来有些奇怪,因此,这是关于它们的初始翻译,可以帮助您更好地理解:

  • lookahead = 期待
  • lookbehind = 查看transiture

很好,为了更好地利用以下阅读,我建议您已经在正则表达式上有基本的菜肴,但是如果您没有听说过,请不要担心,我会留下一个定义的主题和帖子链接(仍然在此网站上)我找到了一种很好的阅读方法:

常规或常规表达方式或正则是指代表示用于识别其他数据字面字符的模式的字符的特征。正则表达式是在徒劳的情况下极为极端的情况,例如验证公式,提取,过滤和分析数据,替换和格式化文本以及其他应用程序。借助Regex的帮助,可以验证某些数据是否遵循特定模式,这使它们成为处理和处理信息的强大工具。

PostPressustórioSobre为Regex:Expressões Regulares I - o básico

你们啊,你们要做什么

您应该知道,我们可以使用基本的REGEX检查模式,但是我们将不一定能够搜索最有效的方法以限于基本。想象一下一个场景,您需要创建一个正则以下的条件,以仅接收具有以下格式的字符串的磅数:

'2kg - R$45,00 4kg - R$122,00 ...'

一见钟情您可能正在考虑使用以下常规:

  • /\d+kg/g

在该区域中,您将选择遵循以下模式的字符: 1或更多。是的,它可以返回英镑,但不会仅返回我们已经希望返回度量单位的金额,即,我们只希望No。E 4 字符串,我们会收到 2kg 4kg
解决这个问题的火灾,我们可以使用正面的lookhead ,如下:

  • /\d+(?=kg)/g

使用此lookhead,我们将仅选择在他们之后拥有字符“ kg”的十九个字符,但没有将它们包括在我们的搜索中。换句话说,我们可以面对 lookahead lookbehind 作为我们将选择的条件的创造者,而无需消耗在我们的通信条件下使用的字符,其中:< /p>

  • lookahead :检查我们选择之后的字符是否具有确定的标准。
  • lookbehind :检查我们选择之前的字符是否具有确定的标准。

好吧,既然您已经对它们所服务的东西有所了解,那么让我们探索每个人:

lookahead-期待

如前所述,使用LookAhead,我们将为我们要消耗的模式创建条件,因为我们可以使用两种类型的lookhead:

  • ?= - >正面的lookahead呼叫,如果您看到apo遵循指定的padrã£o,返回sele㧧o。

  • ?! - >称为负外观,仅在不遵循指定模式后发生的内容时返回选择。

让我们以JavaScript为每个示例:

正面的外观(?=)

在此示例中,我们将使用积极的外观仅返回具有姓氏'Silva'的人的先前名称:

const nomes = [
    'Lucas Silva', 
    'Maria Silva Rodrigues', 
    'João Guilherme Silva', 
    'Pedro Oliveira',
    'Ana Julia Rodrigues'
    ]

const pattern = /.+(?=\sSilva)/
const primeirosNomes = nomes.reduce((acumulador, nome) => {
        const correspondente = nome.match(pattern);
        correspondente && acumulador.push(correspondente[0]);
        return acumulador
    }, [])

console.log(primeirosNomes); // [ 'Lucas', 'Maria', 'João Guilherme' ]
  • 使用的正则是:kude3

  • explica㧣o da Regex:

    • /->正在划界,划界正则判断。
    • .+->点代表任何字符,+量词表示先前的字符(任何字符)应发生一次或多次。
    • (?=) - >将字符的正面外观分组。
    • \ ssilva - >代表LookAhead的标准,其中 \ s 是用于表示空间的掌杆菌,其余的就是我们正在寻找的姓氏。
  • 操作结果:koud6

负面外观(?!)

还记得本文开头使用的字符串吗?好吧,如果您不记得我会刷新您的记忆:

'2kg - R$45,00 4kg - R$122,00 ...'

在此示例中,我将通过添加革兰氏的表示并将vangulas换成点来使我更复杂一些:

'2.50kg - R$45.00 4.35kg - R$122.00 5.60kg - R$122.00...'

准备好了!但是...如果您现在只想在reais中拿出值怎么办?没有英镑或货币的代表?
为此,我们可以使用负面的lookahead,对我们最初所做的事情进行逆羊毛:

const string = '2.50kg - R$45.00 4.35kg - R$122.00 5.60kg - R$136.00';
const pattern = /\d+\.\d{2}(?!kg)/g;
const valores = string.match(pattern);
console.log(valores); // [ '45.00', '122.00', '136.00' ]
  • 使用的正则是:kude9

  • explica㧣o da Regex:

    • \d+->使用metaCaracter \ d 表示富量和量词+量词,以表示可能出现一次或多次。
    • \.->代表(点)作为字面角色。
    • \d{2}->使用 {n} 量词暗示必须发生两次。
    • (?!)->分组负面外观的字符。
    • kg->表示我们先前指定的标准不应该在他之后不应具有的字符集。
    • g->用于制作全局通信的标志,在字符串中找到所有标准的出现。
  • 操作结果:koud16

看 - 看它

通过LookAhead的外观,我们创建了一个应该在我们想要消费的模式之前出现的条件,就像它一样,我们还将有两种类型的使用:

  • ?<= - >称为阳性lookbehind,仅在其具有指定模式之前的内容时返回选择。

  • ?>

我还将按照JavaScript遵循有关它们的示例,但我想警告说,某些环境可能与lookbehind不兼容。

积极的外观(?<=)

众所周知,不会总是只有一种方法来完成我们想要的目标,因此,对于此示例,我们可以从同一以前的示例使用,区别是我们不会望而却步。我将再次将其介绍给字符串,以便您需要返回上一个示例:

'2.50kg - R$45.00 4.35kg - R$122.00 5.60kg - R$122.00...'

eaã,您是否以某种方式仅以正面的方式返回现金价值?我会给你一个可能的可能:

const string = '2.50kg - R$45.00 4.35kg - R$122.00 5.60kg - R$136.00';
const pattern = /(?<=R\$)\d+\.\d{2}/g;
const valores = string.match(pattern);
console.log(valores); // [ '45.00', '122.00', '136.00' ]
    <

    REGEX利用:Kude18

  • explica㧣o da Regex:

    • (?<=)->将正面的字符分组。
    • R\$->代表字符 r $ 从字面上看,在正面的情况下,我们会发现它们是否在标准之前,我们想选择是否不是标准的选择。
    • \d+->表示将发生一个或多个字符。
    • \.->代表(点)作为字面角色。
    • \d{2}->指示将出现两个数字的发生。
    • g->全局通信的标志。
  • 操作结果:koud16

负外观(?<!)

我承认,使用负面外观很难找到一个好的例子,我认为许多人都会有一种不那么有趣的形式,或者使用比应该更复杂,但是幸运的是我发现我相信这将是幻想的理解。在此示例中,您有一个带有正面和负面品种的字符串:

const numeros = '22 -32 43 -522 6 72 311 15 -13 ...';

无论如何,您如何使用负面的外观仅返回正面否。在看到决议之前,请随时考虑答案。

作为答案,您可以使用以下常规:

const numeros = '22 -32 43 -522 6 72 311 15 -13 ...';
const numerosPositivos = numeros.match(/(?<!-\d*)\d+/g);
console.log(numerosPositivos); // [ '22', '43', '6', '72', '311', '15' ]
  • 使用的正则是:kude26

  • explica㧣o da Regex:

    • (?<!)->分组负面外观的字符。
    • -\d*->指示我们想要的数字不应 - (负)信号,我们还使用 \ d **** apons - 信号的标准为no。
    • \d+->表示将发生一个或多个字符。
    • g->全局通信的标志。
  • 操作结果:koud31

你的时间

现在您已经知道了如何使用上述术语,您可以使用外观和外观返回以下电子邮件提供商的名称吗?

const emails = ['john_doe@gmail.com', 'marilia022@yahoo.com.br', 'gustavo_amado@outlook.com']

我将留下您可以用作常规的基础的方式,并记住,在此挑战中,我们只需要提供商的名称,因此您应该返回以下值的列表:[ 'gmail', 'yahoo', 'outlook' ]

const emails = [ 
    'john_doe@gmail.com', 
    'marilia022@yahoo.com.br', 
    'gustavo_amado@outlook.com' 
]

const pattern = defina sua regex aqui;
const provedores = emails.reduce((acumulador, valor) => {
    const provedor = valor.match(pattern)[0];
    acumulador.push(provedor)
    return acumulador
}, [])

console.log(provedores);