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兼容,但希望其他人能够帮助回答这个问题。