regex 正则表达式替换所有前导和尾随非字母数字

gpfsuwkq  于 2023-06-30  发布在  其他
关注(0)|答案(2)|浏览(107)

superTrim()满足描述并通过测试的正确正则表达式是什么:

// removes all leading and trailing whitespace, newlines, escaped whitespace,
//    escaped punctuation, punctuation, special characters, etc
//    - EVERYTHING leading and trailing that is not alphanumeric.
const superTrim = (src: string) => src.replace(/<-- correct regex here --> /gm, "").trim();

if (import.meta.vitest) {
  const { describe, expect, it, test } = await import("vitest");

  test("superTrim", () => {
    expect(superTrim("John Smith")).toBe("John Smith");
    expect(superTrim("Bobby Lee\\n \\n,  ")).toBe("Bobby Lee");
    expect(superTrim("Sally Mae\n \n,  ")).toBe("Sally Mae");
    expect(superTrim("JCP Dept. Stores\\nAttn: Marketing\n , '\n '"))
      .toBe("JCP Dept. Stores\\nAttn: Marketing");
  });
}

我确实发现了一些类似但不同的现有问题,我认为一个新的问题是有道理的。我可以迭代字符串标识标记以返回一个切片,但这似乎是正则表达式的解决方案。

13z8s7eq

13z8s7eq1#

你只需要捕获并返回你想要的部分:

// returns EVERYTHING bounded by the first and last non-escaped, alphanumeric.
const getLean = (src) => src.match(/^(\\+[0-9a-zA-Z]|[^0-9a-zA-Z])*(.*?)([^0-9a-zA-Z]|\\+[0-9a-zA-Z])*$/)[2];

console.log(getLean("John Smith") === "John Smith")
console.log(getLean("Bobby Lee\\n \\n,  ") === "Bobby Lee")
console.log(getLean("Sally Mae\n \n,  ") === "Sally Mae")
console.log(getLean(" %*&-->JCP Dept. Stores\\nAttn: Marketing\n , '\n '") === "JCP Dept. Stores\\nAttn: Marketing");
console.log(getLean("\nBobby Lee\\n \\c\t,  ") === "Bobby Lee")

Regex捕获组:

  1. ^(\\+[0-9a-zA-Z]|[^0-9a-zA-Z])*
    在字符串的开头,匹配文字\一次或多次,后跟一个字母数字,或者任何一个非字母数字,尽可能多地匹配零次或多次(贪婪)。
  2. (.*?) * 你寻找的那片 *
    任何东西和一切,留在中间(非贪婪)。
  3. ([^0-9a-zA-Z]|\\+[0-9a-zA-Z])*$
    与1相同,但锚定在字符串的末尾,|(OR)正好相反,以保持对称
uhry853o

uhry853o2#

您可以使用此规律性来满足您的要求:(^[\W\\n]*)|([\W\\n]*$)

相关问题