Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
582 views
in Technique[技术] by (71.8m points)

perl - regex to match word boundary beginning with special characters

I have regex that matches words fine except if they contain a special character such as ~Query which is the name of a member of a C++ class. Need to use word boundary as shown below for member names that are single characters. $key =~ /$match/

I tried numerous expressions I thought would work such as /[~]*$match/ or /[~]*$match/

Is it possible to put a word boundary on words that may contain a special character?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

is short for

(?:(?<!w)(?=w)|(?<=w)(?!w))

If you want to treat ~ as a word character, change w to [w~].

(?:(?<![w~])(?=[w~])|(?<=[w~])(?![w~]))

Example usage:

my $word_char = qr/[w~]/;
my $boundary  = qr/(?<!$word_char)(?=$word_char)
                  |(?<=$word_char)(?!$word_char)/x;

$key =~ /$boundary$match$boundary/

If we know $match can only match something that starts and ends with a $word_char, we can simplify as follows:

my $word_char   = qr/[w~]/;
my $start_bound = qr/(?<!$word_char)/;
my $end_bound   = qr/(?!$word_char)/;

$key =~ /$start_bound$match$end_bound/

This is simple enough that we can inline.

$key =~ /(?<![w~])$match(?![w~])/

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...