正则表达式(Javascript) - 匹配某些聊天查询

时间:2017-01-28 21:35:11

标签: javascript regex

所以我发帖是因为我花了几个小时在一个过滤器上工作,该过滤器应该根据所述消息的开头仅记录某些聊天消息。我已达到约五十五岁的程度,但我对正则表达式缺乏了解,使我无法继续研究它。

基本上,表达式是假设以匹配消息,这些消息是一些恼人的事情之一。如果这太具体了,我很抱歉,我不确定如何让所有条件协同工作。

  1. "字":(任何不是&#34的字;注意"或"输入:s" - 所以像约翰:
  2. word _ word :(这次,第二个词可以是任何东西) - 像 John_Smith:
  3. [Tag] word :或[Tag] word _ word :(标签是unicode字符或两个字符之间)方括号) - 像 [DM] Tom_Cruise:或类似的
  4. 以上之一,减去结肠。这是我遇到问题的地方。类似 [DM] Tom_Cruise wave。
  5. 以(WHISPER)或(SHOUT)开头。在这种情况下,它后面的内容并不重要。
  6. 我设法获得了适用于大多数情况的正则表达式,但我无法在不收到不需要的邮件的情况下使条件 4 工作。 此外,如果消息(以每行的字符串形式接收)以(OOC)开头,则不应该匹配。如果稍后在消息中显示(OOC),那就没问题了。如果字符串以"结束游戏结束。"或者"离开游戏。",它也应该不匹配。

    所以...是的,我完全坚持让条件4工作,并希望帮助我做到这一点的社区不会回答一个(希望不是太具体)的问题。它。这是我得到它的表达方式:

    (?!^\(OOC\))(_[a-z]+:)|(^[a-z]+:)|(^[a-z]+ [a-z]+ )
    

    它可以匹配上述大多数条件,除了 4 和一些 1 。我无法弄清楚如何获取特定单词(注意:和类型:s)不匹配,4只是弄乱了我的其他一些条件。最后,如果以(OOC)开头,字符串匹配另一个条件,它似乎不会停止匹配。

    很抱歉,如果这太具体了,但我完全陷入困境,基本上只是今天拿起了正则表达式。我会带点什么。

    修改

    示例:

    • [AT] Smith_Johnson:"你好。" - 条件3下的匹配,正常工作

    • Tom_Johnson:走到一边。 - 条件2下的匹配,正常工作

    • 注意:私人木门被锁上了。 - 由于条件1而不匹配,但目前

    • 汤姆像傻瓜一样跳来跳去。 - 应在条件4下匹配,不

    • (OOC)SmithsonsFriend:嘿伙计们,回来 - 匹配,但不应该在不匹配的说明符下

    • (WHISPER)Bob_Ross:"伙计,这是蹩脚的。" - 条件5

    • 西海岸:这是一个可爱的居住地。 - 由于空白而无法匹配,这很好

    • 乔加入了比赛。 - 匹配,不应该在不匹配的说明符下

    编辑两个

    澄清:

    A)字符串以(OOC)开头 - 从不匹配

    B)字符串以(WHISPER)或(SHOUT)开头 - 始终匹配

    如果A和B都不适用,则转到条件1-4。

2 个答案:

答案 0 :(得分:1)

您可以使用此正则表达式:

^(?:\(shouts\)|\(whisper\))?(?:\[[A-Z]{1,2}\])?(?!Notice|Note)[A-Za-z]*(?:_[A-Za-z]*)?(?::|\s(?![A-Za-z]*:))(?!(?:joined|left) the game)
  • ^字符串的开头(确保逐行检查)
  • (?:\(shouts\)|\(whisper\))?允许使用(shouts)(whisper)
  • 等可选序列
  • (?:\[[A-Z]{1,2}\])?匹配A-Z内有1个或2个[]字符的非捕获组,这是可选的(因为最后为?
  • (?!Notice|Note):单词列表,不属于后续选择器
  • [A-Za-z]*匹配尽可能多的字母字符
  • (?:_[A-Za-z]*)?匹配_后跟字母字符
  • (?::|\s(?![A-Za-z]*:)):或空格字符\s匹配,但[A-Z]:
  • 不能跟随
  • (?!(?:joined|left) the game)否定前瞻:整个正则表达式不匹配,如果此模式匹配

如果您想要,请在正则表达式中添加不区分大小写的标记/i匹配(whisper)(WHISPER)

→以下是您在更新 regex101中进行实时测试的示例文本

答案 1 :(得分:1)

不是将它设为一个大的(巨大的)正则表达式,而是可以创建一个接收消息的函数,然后根据一些正则表达式进行检查(非常灵活且更容易实现) 。像这样:

function isValid(msg){
    // starts with "WHISPER" or "SHOUT"
    if(/^(?:whisper|shout)/i.test(msg)) return true;

    // Check if it begins with "notice:" or "type:"
    if(/^(?:notice|type)\s*:/i.test(msg)) return false;

    // Check if it ends with "joined the game" or "left the game."
    if(/(?:joined|left)\s+the\s+game\.?$/i.test(msg)) return false;

    // starts with "(ooc)"
    if(/^\(ooc\)/i.test(msg)) return false;

    // "[at]word:" or "[a]word_word" or "word:" or "word_word" ...
    if(/^(?:\[[a-z]{1,2}\])?[a-z_]+:?.*$/i.test(msg)) return true;

    return false;
}

示例:

function isValid(msg) {
  if (/^(?:whisper|shout)/i.test(msg)) return true;
  if (/^(?:notice|type)\s*:/i.test(msg)) return false;
  if (/(?:joined|left)\s+the\s+game\.?$/i.test(msg)) return false;
  if (/^\(ooc\)/i.test(msg)) return false;
  if (/^(?:\[[a-z]{1,2}\])?[a-z_]+:?.*$/i.test(msg)) return true;
  return false;
}

function check() {
  var string = prompt("Enter a message: ");
  if(isValid(string))
    alert(string + " is valid!");
  else
    alert(string + " is not valid!");
}
<button onclick="check()">TRY</button>