正则表达式专门匹配@ first.last格式,之前或之后均不匹配

时间:2019-06-24 19:46:24

标签: javascript regex

我有一个格式为hello-list.component.ts的字符串。我想编写一个正则表达式来选择格式为some words @first.last more words @first.last的任何子字符串,以便可以用其他东西替换该子字符串。此正则表达式应仅考虑@first.last子字符串,并忽略@first.last符号前面的任何字符或@之后的第一个空格之后的任何字符,包括该空格。例如:

last

我尝试过的正则表达式:

  • regex = new RegExp(/[^\[\s](@[a-zA-Z0-9\.\-]+)/im); str = 'Hey @first.last tell [@first.last] to check this out'; str = str.replace(regex, 'Keanu'); /** str: 'Hey Keanu tell [@first.last] to check this out? **? ->将使我成为其中的一部分,但不会摆脱(@[a-zA-Z0-9\.\-]+)符号前的字符

  • @->如果[^\[](@[a-zA-Z0-9\.\-]+)是字符串ie的第一个子字符串,则此正则表达式将失败。 @first.last不会被str.replace调用更改

  • @first.last look at this->尝试过滤掉前导空格

  • [^\[\s](@[a-zA-Z0-9\.\-]+)

让我大跌眼镜的是[^.+?](@[a-zA-Z0-9\.\-]+)之前要包含的内容,以确保我只检测到(@[a-zA-Z0-9\.\-]+)符号以及紧跟其后的字符(以first.last格式)。

感谢您的帮助和帮助。

2 个答案:

答案 0 :(得分:3)

使用诸如[a-zA-Z0-9.-]+之类的字符类有点广泛,因为它不能保证例如点号不在结尾。它可以匹配列出的任何一个,因此例如--.--也是有效的。请注意,您不必逃脱点,也不必逃脱破折号,如果它在末尾。

  1. first pattern (@[a-zA-Z0-9\.\-]+)两者都匹配,因为在左右两侧没有设置边界。

  2. second pattern [^\[](@[a-zA-Z0-9\.\-]+)匹配包括前导空格,因为它与否定的字符类[^\[]匹配,而否定字符类[

    < / li>
  3. third pattern [^\[\s](@[a-zA-Z0-9\.\-]+)不匹配,因为现在否定的字符类[^\[\s]不允许匹配前导空格。

  4. fourth pattern [^.+?](@[a-zA-Z0-9\.\-]+)与前导[匹配,因为它与[^.+?]匹配,而.+?不匹配或(^|\s)@\w+\.\w+(?!\S)

您可以使用捕获组,其中捕获组可以匹配字符串的开头或空格char,然后将@部分与字符char和点匹配:

(^|\s)

说明

  • @\w+\.\w+捕获组1,字符串或空白字符的开头
  • @匹配\w,然后匹配1+个单词字符,一个点和1+个单词字符(除了[a-zA-Z0-9]以外,您还可以使用(?!\S)
  • $1Keanu断言直接在右边的不是非空格字符

在替换项中,使用替换项regex = /(^|\s)@\w+\.\w+(?!\S)/g; str = 'Hey @first.last tell [@first.last] to check this out'; str = str.replace(regex, "$1Keanu"); console.log(str);造成的第一个捕获组

Regex demo

#!/usr/bin/ruby -w
raise(RuntimeError, 'A GNU/Linux or an Android system is needed') unless /linux/ === RUBY_PLATFORM.downcase

require 'objspace'
STDOUT.sync = true
GC.start(full_mark: true, immediate_sweep: true)

define_method(:show) { "System Memory Usage: #{::IO.readlines('/proc/meminfo').then { |x| [x[0], x[2]] }
                            .map { |x| x.split[1].to_f }.reduce(:-)./(1024).round(3)} MiB "\
                                "| Available: #{::IO.readlines('/proc/meminfo')[2].split[1].to_f./(1024).round(3)} MiB" }

define_method(:memsize) { |obj| ObjectSpace.memsize_of(obj).to_s.reverse.gsub(/\d{1,3}/).to_a.join(',').reverse << ' Bytes'}

答案 1 :(得分:0)

我的猜测是,也许此表达式也可以在这里使用

(\s+|^)(@[a-z0-9-]+\.[a-z0-9-]+)(\s+|$)

\s+是为了以防其他空格,如果愿意,我们可以简单地修改char类。

const regex = /(\s+|^)(@[a-z0-9-]+\.[a-z0-9-]+)(\s+|$)/gis;
const str = `some words @first.last more words @first.last
some words @first.last more words @first.last012 some other text
some words @first.last more words @first.last012\$%^&
some words@first.last more words@first.last`;
const subst = `$1Keanu$3`;
const result = str.replace(regex, subst);

console.log(result);

Please see the demo for explanation and more info.

RegEx电路

jex.im可视化正则表达式:

enter image description here