求一个匹配hash的Nodejs正则

求一个匹配hash的Nodejs正则

示例:#hello world# 匹配##之间的内容,如果没有#结尾,则匹配#与空格之间的。例如: #hello world#,则提取hellow world,但如果是:#hello world,则提取hello,英文空格真讨厌。

我目前想到的是笨方法,/(#(.+?)#)|(#(.+)\s)/

10 回复

当然可以!以下是关于如何使用Node.js编写一个正则表达式来匹配 # 符号之间的内容的详细解答。

标题

求一个匹配hash的Nodejs正则

内容

假设我们有以下字符串:

const str = "#hello world#";

我们需要从字符串中提取 # 符号之间的内容,并处理没有 # 结尾的情况。具体来说,如果字符串以 # 开头但没有 # 结尾,则只提取到第一个空格为止;如果字符串以 # 开头且以 # 结尾,则提取两个 # 之间的内容。

我们可以使用正则表达式来实现这一点。下面是一个有效的正则表达式及示例代码:

示例代码

const str1 = "#hello world#"; // 正常情况
const str2 = "#hello world";   // 没有 # 结尾的情况

// 正则表达式
const regex = /#([^#\s]+)(?:\s|#)?/;

// 匹配并提取内容
function extractHashContent(str) {
    const match = str.match(regex);
    if (match && match[1]) {
        return match[1];
    }
    return null;
}

console.log(extractHashContent(str1)); // 输出: "hello"
console.log(extractHashContent(str2)); // 输出: "hello"

解释

  • 正则表达式: /#([^#\s]+)(?:\s|#)?/

    • #: 匹配 # 字符。
    • ([^#\s]+): 匹配 ## 之间的一个或多个非 # 和非空白字符,并将其捕获为组。
    • (?:\s|#)?: 非捕获组,匹配一个空格或另一个 #,但不捕获它们。这使得我们可以在字符串以 # 结尾时正确匹配,也可以在没有 # 结尾时仅匹配到第一个空格。
  • 函数:

    • str.match(regex): 使用正则表达式匹配字符串。
    • 如果匹配成功,match[1] 将包含捕获组中的内容,即 # 符号之间的文本。

通过这种方式,我们可以灵活地处理不同情况下的输入字符串,并正确提取所需的内容。


re = /#(.*)[\s#]/

javascript 没有反向预查找,/\#\w+(?=\#\s)/再用replace(/^\#/)把首个#替换掉

但如果是#hello world##,匹配的结果是 hello world#,但实际上要的是hello world /#(.*)[\s#]/.test(’#hello world again again’),结果匹配的是hello world again,应该是匹配hello

反向可以用XRegExp,但感觉你这个反而复杂了

(?:#(.+)#)|(?:#([^\s]+)) 试试吧 似乎你说的好像都可以.

谢,不过如果有两个##的话,还是不对

/(?:#(.+)#)|(?:#([^\s]+))/.test("#hello world##") console.log(RegExp.$1)

理想结果是匹配 hello world,但实际上是匹配 hello world#

/#(.+?(?=#)|\S+)/

/(?:#(\w+(?:(?=\s+\w+\#)|(?=\#))))/ 只能做到这一步了: 1.matches集的第二个才是提取的字母 2.不支持全局匹配,即是只支持单条匹配

根据你的需求,我们需要编写一个正则表达式来匹配 # 符号之间的内容。如果字符串以 # 结尾,则只提取到该 # 之前的内容;否则,提取到第一个空格之前的内容。

这里是一个简洁的实现方式:

const str1 = "#hello world#";
const str2 = "#hello world";

function extractHashContent(str) {
    const regex = /#([^#\s]+)(?:\s|#|$)/;
    const match = str.match(regex);
    if (match) {
        return match[1];
    }
    return null;
}

console.log(extractHashContent(str1)); // 输出 "hello"
console.log(extractHashContent(str2)); // 输出 "hello"

解释:

  • 正则表达式 /#([^#\s]+)(?:\s|#|$)/ 的各部分含义:

    • #:匹配 # 符号。
    • ([^#\s]+):匹配一个或多个非 # 和非空格的字符,并将其捕获为组 1。
    • (?:\s|#|$):这是一个非捕获组,用于匹配可能的空格、# 或字符串结束。
      • \s 匹配任何空白字符(包括空格)。
      • # 匹配 # 符号。
      • $ 匹配字符串的结尾。
  • str.match(regex) 方法用于在字符串中查找匹配项,返回一个数组。如果找到匹配项,则返回捕获组 1 的值,即 # 符号之间的内容;如果没有找到匹配项,则返回 null

通过这种方法,你可以轻松地提取出你所需要的内容。

回到顶部