我有一个与以下文本相似的文本。它包含4
或digit-
后面的whitespace
位数字,后跟.
,?
,-digit
或{{1 }}。
我需要匹配第一段中的所有数字,但不匹配第二段中的所有数字,因为这些数字不符合我的条件。
whitespace
Lorem ipsum 3400-digit, sit amet 5000 consectetur adipisicing elit. Natus, explicabo 6700? Itaque iure ipsum laboriosam, ex nemo delectus iste quia cupiditate digit-9134? Iste nam digit-2456 at voluptate est 8456-digit? At excepturi quis voluptatibus 7500.
StackOverflow 中已经存在一些类似的问题。我已经浏览了其中一些(下面的链接),但是我仍然无法做到这一点。在将此问题标记为重复之前,请检查您的解决方案是否在第一段中找到所有出现的4位数字,但在第二段中没有找到所有数字。
答案 0 :(得分:4)
您可以使用以下模式:
/(?:\bdigit-|\s|^)(\d{4})(?=[.?\s]|-digit\b|$)/gi
请参见regex demo。您需要获取所有第1组的值。
详细信息
(?:\bdigit-|\s|^)
-digit-
(作为一个整体),空格或字符串开头(\d{4})
-第1组:四位数(?=[.?\s]|-digit\b|$)
-在右边,必须有.
,空格,?
,-digit
(作为一个整体)或字符串的结尾。 注意。如果不进行前瞻性操作,则连续的空格分隔的匹配项将被忽略。JS演示:
var strs = ["Lorem ipsum 3400-digit, sit amet 5000 consectetur adipisicing elit. Natus, explicabo 6700? Itaque iure ipsum laboriosam, ex nemo delectus iste quia cupiditate digit-9134? Iste nam digit-2456 at voluptate est 8456-digit? At excepturi quis voluptatibus 7500.", "Lorem ipsum $5000 dolor sit amet consectetur adipisicing elit. Obcaecati tempora dolorum repellat reiciendis cum soluta deserunt ex voluptatibus, nam illum veniam £5550 quidem aperiam sequi, nostrum sed? Quidem eveniet maiores #5550 autem. https://codepen.io/pen/5000/3454" ];
var rx = /(?:\bdigit-|\s|^)(\d{4})(?=[.?\s]|-digit\b|$)/gi;
for (var s of strs) {
var m, res =[];
while(m=rx.exec(s)) {
res.push(m[1]);
}
console.log(res);
}
答案 1 :(得分:2)
(\s|digit-)([0-9]{4})(?=-digit|\.|\?|\s)
查询的开头和结尾都需要一个OR
语句,中间是四位数。
进一步说明:
(?!\s|digit-)
-前瞻性否定:空格或digit-
[0-9]{4}
-一个从0到9的数字,正好是四次(?=-digit|\.|\?|\s)
-积极向前看:要么-digit
,一个.
(因为.
是Regex中的特殊字符而被转义),一个问号(对于相同的字符也进行了转义)原因)或空格。