JavaScript中匹配以三个点开头的字符串并处理的正则问题
处理JavaScript字符串数组:移除开头三点并截断问号后内容
一、先筛出开头带三个点的字符串
你之前用^\.只匹配单个点,是因为正则里.是通配符,必须用\转义;要匹配三个连续的点,要么写^\.\.\.,要么用更简洁的^\.{3}({3}表示重复前面的字符3次)。
对新手来说,用字符串原生的startsWith('...')更直观好懂:
const originalArr = ["...how to do this? - Th0be [22.2.2022]", "普通字符串", "...另一测试? 多余内容"]; // 筛选出开头是...的字符串 const targetStrings = originalArr.filter(str => str.startsWith('...'));
二、处理字符串的两个步骤
1. 去掉开头的三个点
既然已经确定字符串开头是三个点,直接用slice(3)从第3个字符开始截取最省事,不用正则:
const withoutDots = targetStr.slice(3);
要是想用正则替换,就用replace(/^\.{3}/, ''),效果完全一致。
2. 截断问号之后的内容(保留问号)
看你的示例,要保留到问号(如果有的话),删掉后面的所有内容。这里用split('?')拆分最直观:
// 按问号拆分字符串 const parts = withoutDots.split('?'); // 如果有问号,就取第一部分加问号;没有就直接用原内容 const finalStr = parts.length > 1 ? `${parts[0]}?` : withoutDots;
要是想用正则,就把?及后面的内容替换成?(没有问号的话不会触发替换):
const finalStr = withoutDots.replace(/(\?.*)$/, '?');
完整代码示例
把筛选和处理逻辑整合到一起:
const originalArr = [ "...how to do this? - Th0be [22.2.2022]", "没带三点的字符串", "...没有问号的内容", "...带问号的例子? 这部分要删掉" ]; const result = originalArr .filter(str => str.startsWith('...')) .map(str => { const withoutDots = str.slice(3); const parts = withoutDots.split('?'); return parts.length > 1 ? `${parts[0]}?` : withoutDots; }); console.log(result); // 输出: // ["how to do this?", "...没有问号的内容", "带问号的例子?"]
对你之前正则问题的补充
- 你写的
^\.只匹配单个点,要匹配开头的三个连续点,用^\.{3}或者^\.\.\.都可以,^确保只匹配字符串开头的点。 - 你用的
[^?]*$其实是匹配字符串末尾所有非问号的字符,这不是你需要的逻辑。要删除问号之后的内容,应该匹配\?.+$(\?匹配问号,.+匹配后面任意内容,$表示到结尾),如果要保留问号,就把这部分替换成?即可。
内容的提问来源于stack exchange,提问作者Th0be
相关产品推荐
相关产品推荐

