SKeney
SKeney

Reputation: 2301

Reg Exp for finding hashtag words

I have the following sentence as a test:

This is a test with #shouldshow and to see if there #show
#yes this#shouldnotshow what is going on here

I have figured out most of the Reg Exp I need. Here's what I have so far: /((?<=#)([A-Z]*))/gi

This matches every tag but also matches the shouldnotshow portion. I want to not match words that are prefixed by anything but # (excluding whitespace & \n).

So the only matched words I should get are: shouldshow show yes. Note: after #show is a newline

Upvotes: 1

Views: 71

Answers (2)

The fourth bird
The fourth bird

Reputation: 163362

Another option could be using your pattern asserting a # on the left that does not have a non whitespace char before it using (?<!\S)# and get the match only without capture groups.

Match at least 1+ times a char A-Z to prevent matching an empty string.

(?<=(?<!\S)#)[A-Z]+

Regex demo

const regex = /(?<=(?<!\S)#)[A-Z]+/gi;
const str = `This is a test with #shouldshow and to see if there #show
#yes this#shouldnotshow what is going on her`;
console.log(str.match(regex));

Upvotes: 0

mplungjan
mplungjan

Reputation: 177950

You just need to see if the hash is prefixed with whitespace or starts the string

https://regex101.com/r/JDuGvr/1

/(\s|^)#(\w+)/gm

with positive lookbehind as OP used

https://regex101.com/r/06X3ZX/1

/(?<=(\s|^)#)(\w+)/gm; 

use [a-zA-Z0-9] if you do not want an underscore

const re1 = /(\s|^)#(\w+)/gm; 
const re2 = /(?<=(\s|^)#)(\w+)/gm; 

const str = `This is a test with #shouldshow and to see if there #show
#yes this#shouldnotshow what is going on here`;

const res1 = [...str.matchAll(re1)].map(match => match[2]); // here the match is the third item
console.log(res1)

const res2 = [...str.matchAll(re2)].map(match => match[0]); // match is the first item
console.log(res2)

Upvotes: 1

Related Questions