我有一个格式为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格式)。
感谢您的帮助和帮助。
答案 0 :(得分:3)
使用诸如[a-zA-Z0-9.-]+
之类的字符类有点广泛,因为它不能保证例如点号不在结尾。它可以匹配列出的任何一个,因此例如--.--
也是有效的。请注意,您不必逃脱点,也不必逃脱破折号,如果它在末尾。
first pattern (@[a-zA-Z0-9\.\-]+)
两者都匹配,因为在左右两侧没有设置边界。
second pattern [^\[](@[a-zA-Z0-9\.\-]+)
匹配包括前导空格,因为它与否定的字符类[^\[]
匹配,而否定字符类[
third pattern [^\[\s](@[a-zA-Z0-9\.\-]+)
不匹配,因为现在否定的字符类[^\[\s]
不允许匹配前导空格。
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);
造成的第一个捕获组
#!/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);
jex.im可视化正则表达式: