0

我正在制作一个正则表达式来匹配我的项目的主题标签。我希望正则表达式匹配由一个空格分隔的主题标签,此内容中没有另一个主题标签,如果后面跟着任何单词(其他空格或 # 除外),则只匹配字符串中的空格。

我真的很想知道我是否可以在正则表达式中做类似“if”的事情,我希望你能帮助我。

所以,在:

"#hashtag?!-=_"  "#hashhash#"  "#hash tag"  "#hash  tag"  "#hash #ahuhuhhuasd" "#hash "

正则表达式必须匹配以下句子:

"#hashtag?!-=_" "#hashhash" "#hash tag" "#hash" "#hash #ahuhuhhuasd" "#hash"
                            (all hashtag)        (one)  (another h.)

实际上,这是我的代码:

#{1,1}\S+\s{0,1}

您可以在此处测试此代码,但它会匹配不需要的内容:

"#ahusdhuas?!__??###hud #ahusdhuads "  
The blank space in the end of the string, the 3 '#' inside the string. 
none of the following content is desired in this string, just "#ahusdhuas?!__??"

很高兴你能帮助我!

4

5 回答 5

1

尝试:

#[^# ]+(?: [^# ]+)*

匹配 a #,然后是一个或多个不是#or的字符,然后是 0 个或多个 ( 一个空格后跟一个或多个不是#or的字符)。?: 使组不被捕获。

如果您根本不想匹配###hud#ahusdhuas?!__??###hud #ahusdhuads因为它以 3 开头,您可以在正则表达式的前面#添加否定的lookbehind ::(?<!#)

(?<!#)#[^# ]+(?: [^# ]+)*

但是,这将在 Ruby 中有效,但在 JavaScript 中无效,因为 JavaScript 不具备进行后视的能力。在这种情况下,您必须使用该#[^# ]+(?: [^# ]+)*模式,并且如果匹配在第一个字符之后开始,请在代码中测试字符串中的前一个字符以查看它是否为#,如果是,则拒绝正则表达式返回的匹配。

于 2013-10-03T02:42:25.833 回答
1

这些是您一直在寻找的吗?

在此处输入图像描述

在此处输入图像描述

于 2013-10-03T02:44:28.280 回答
1

我认为这是你需要的:

(#(?:\s?[^#\s]+)+)

以下是一些测试:

在此处输入图像描述

于 2013-10-06T22:13:30.383 回答
1

我想我明白了,虽然我不习惯 Javascript 的正则表达式,因为我只使用 Python。
我在 Monty Wild 提供的网站regexpal.com上测试了以下内容,它是唯一一个向我展示所有匹配的子字符串:

(?:^ |^| )(#[^#\s]+(?: [^#\s]+)?)(?:(?=\Z| \Z| \S)| +(?=#))

结果

#hashtag?!-=_
#hash tag
#hash
#ahuhuhhuasd
#hash

由于 Javascript 的正则表达式不接受后向断言,我使用了一个技巧来使两个或多个空格前面的 hastag 不匹配:正则表达式机器将这些前面的空格用作前面匹配中的后续空格:这就是+(?=#)如果有多个匹配,则正则表达式的最后一部分的作用是触发匹配的尾随空格的匹配。仅当前一部分(?=\Z| \Z| \S)不匹配时,此消耗才会干预

于 2013-10-06T23:25:11.470 回答
1

在标准 HTML 页面和 Firebug 中也试过这个......

适用于您提供的输入。

var hashTags = ["#hashtag?!-=_", "#hashhash#", "#hash tag", "#hash  tag", "#hash #ahuhuhhuasd", "#hash ", "#hash #", "#foo bar baz"];
hashTags.forEach(function(el, idx, arr) {
    console.log( el.match(/#([^#\s]|(( [^\s])(?!\s|$)))+/g));
});

// Console output
> ["#hashtag?!-=_"]
> ["#hashhash"]
> ["#hash tag"]
> ["#hash"]
> ["#hash #ahuhuhhuasd"]
> ["#hash"]
> ["#hash"]
> ["#foo bar baz"]
于 2013-10-07T13:22:42.457 回答