Regex 正则表达式用于确定卷/章
我从一些新颖的网站上收集了大量的帖子,他们在这些网站上用这个缩写来表示卷和章节:Regex 正则表达式用于确定卷/章,regex,Regex,我从一些新颖的网站上收集了大量的帖子,他们在这些网站上用这个缩写来表示卷和章节:v5c91。在这里,我们有第五卷和第91章 以下是一些标题示例: $string = 'hello v2c19 lorem'; $string = 'hello v2 c19 lorem'; $string = 'hello c19 lorem'; $string = 'v8 hello c19 lorem'; $string = 'hello lorem v01'; 我可以使用什么正则表达式从这些示例中提取卷和章
v5c91
。在这里,我们有第五卷和第91章
以下是一些标题示例:
$string = 'hello v2c19 lorem';
$string = 'hello v2 c19 lorem';
$string = 'hello c19 lorem';
$string = 'v8 hello c19 lorem';
$string = 'hello lorem v01';
我可以使用什么正则表达式从这些示例中提取卷和章节?因此,我最终使用了类似于v8c19
的内容,以避免在标题中与v{num}和c{num}匹配,我认为您需要这样的内容:
(\bc\d+)\bv\d+(c\d+)
将捕获章节,(\bv\d+)\bc\d+(v\d+)
将捕获卷
编辑:要捕获像c2.5这样的部分章节,只需将\d+
替换为略微修改的正则表达式(?:[0-9]*[。])?[0-9]+
它查找单词边界,后跟字母(c或v),然后是数字,或者在v1c3的情况下,它查找后跟匹配的正确前缀
以下是一些例子:
const输入=[
“你好,v2c19 lorem”,
“你好,v2.5 c19 lorem”,
“你好c19 lorem”,
“v8 hello c19 lorem”,
“你好,lorem c01”,
“novolume nav123”,
“你好,noch123pter”,
];
常量find=(str,regex)=>{
设res=null;
常量匹配=regex.exec(str);
如果(匹配){
res=匹配[1]|匹配[2];
}
返回res;
};
常量浮点=`(?[0-9]*[.])?[0-9]+`;
const vRE=new RegExp(`(\\bv${FLOAT})\\\bc${FLOAT}(v${FLOAT})`);
const cRE=new RegExp(`(\\bc${FLOAT})\\\bv${FLOAT}(c${FLOAT})`);
常量输出=输入。映射((标题)=>{
常量章节=查找(标题,cRE);
常量卷=查找(标题,vRE);
返回{
标题
章
体积
};
});
控制台日志(输出)代码>为了避免将标题与其中的v{num}和c{num}相匹配,我认为您需要如下内容:
(\bc\d+)\bv\d+(c\d+)
将捕获章节,(\bv\d+)\bc\d+(v\d+)
将捕获卷
编辑:要捕获像c2.5这样的部分章节,只需将\d+
替换为略微修改的正则表达式(?:[0-9]*[。])?[0-9]+
它查找单词边界,后跟字母(c或v),然后是数字,或者在v1c3的情况下,它查找后跟匹配的正确前缀
以下是一些例子:
const输入=[
“你好,v2c19 lorem”,
“你好,v2.5 c19 lorem”,
“你好c19 lorem”,
“v8 hello c19 lorem”,
“你好,lorem c01”,
“novolume nav123”,
“你好,noch123pter”,
];
常量find=(str,regex)=>{
设res=null;
常量匹配=regex.exec(str);
如果(匹配){
res=匹配[1]|匹配[2];
}
返回res;
};
常量浮点=`(?[0-9]*[.])?[0-9]+`;
const vRE=new RegExp(`(\\bv${FLOAT})\\\bc${FLOAT}(v${FLOAT})`);
const cRE=new RegExp(`(\\bc${FLOAT})\\\bv${FLOAT}(c${FLOAT})`);
常量输出=输入。映射((标题)=>{
常量章节=查找(标题,cRE);
常量卷=查找(标题,vRE);
返回{
标题
章
体积
};
});
控制台日志(输出)代码>仅提供卷或章节时会发生什么情况?如果v01
不是卷,而是某些版本
?正则表达式不会区分两者。这里的规则是什么?如果您计划匹配的c
或v
后跟1+个数字作为一个完整的单词,这将是一个非常基本的正则表达式,但在各种情况下可能会过度使用。请解决以下问题:1)添加语言(或正则表达式风格)标记,2)添加到目前为止的代码,3)如果代码太糟糕,添加实际的模式要求。@blhs如果提供了其中一个,例如hellov9ipsum
,那么我们得到v9
。因此,只要是音量。@WiktorStribiżew我拉的帖子类型不会使用v
的任何其他变体,比如version
。所以我理解这可能是入门级的东西。如果只提供卷或章节,会发生什么?如果v01
不是卷,而是一些版本
?正则表达式不会区分两者。这里的规则是什么?如果您计划匹配的c
或v
后跟1+个数字作为一个完整的单词,这将是一个非常基本的正则表达式,但在各种情况下可能会过度使用。请解决以下问题:1)添加语言(或正则表达式风格)标记,2)添加到目前为止的代码,3)如果代码太糟糕,添加实际的模式要求。@blhs如果提供了其中一个,例如hellov9ipsum
,那么我们得到v9
。因此,只要是音量。@WiktorStribiżew我拉的帖子类型不会使用v
的任何其他变体,比如version
。所以我知道这可能是入门级的东西。我能让它与float一起工作吗,比如hello c9.5 ispum
?有没有一种方法可以将它们结合起来,使其与hello v2c95 ipsum
匹配?我不是OP,但我希望看到您示例代码的PHP版本+1当然,这只是添加的问题,而不是\d+。我会更新的answer@GaryWoods我不懂PHP,现在学习它已经太晚了。希望其他人能帮助回答这个问题,尽管核心正则表达式应该与PCRE兼容。我能让它与float一起工作吗,比如hello c9.5 ispum
?有没有一种方法可以将它们结合起来,使其与hello v2c95 ipsum
匹配?我不是OP,但我希望看到您示例代码的PHP版本+1当然,这只是添加的问题,而不是\d+。我会更新的answer@GaryWoods我不懂PHP,现在学习它已经太晚了。尽管核心正则表达式应该与PCRE兼容,但希望其他人能够帮助回答这个问题。