组合几个正则表达式
Combine a few regular expressions
我有一个字符串需要使用正则表达式进行更改。所以尝试了很多不同的东西,这就是我的接近程度。
以下是字符串可以是什么以及结果应该是什么的几个示例:
case A: "Schoenen US 30 / " should become -> "30"
case B: "Dames US 30 / " should become -> "US 30"
case C: "Dames US w30 / " should become -> "US 30"
case D: "Heren US w30 / L34" should become -> "US 30 / 34"
case E: "Dames US L / " should become -> "US L"
所以我需要做的是:
1.匹配部分:"Schoenen US "、"Dames "和"Heren "(所以包括结尾space)。
2. 匹配字符串中的任意"w"、"W"、"l"和"L"(需要去掉)
3. 只匹配字符串末尾的“/”(如果存在)
所以我想到了什么:
case A: "/\b(Dames[ ]|dames[ ]|Heren[ ]|heren[ ]|Schoenen US[ ]|[WwLl]).([0-9][0-9]).(\/ )/g" with substitution ""
case B & C: "/\b(Dames[ ]|dames[ ]|Heren[ ]|heren[ ]|Schoenen US[ ]|[WwLl]| \/ )/g" with empty substitution
case D: "/\b(Dames[ ]|dames[ ]|Heren[ ]|heren[ ]|Schoenen US[ ]|[WwLl])/g" with empty substitution
case E: No idea how to do this
这些正则表达式做我想做的事(当然 E 的情况除外)。但问题是我只能使用一个正则表达式,所以我需要以某种方式组合所有 4 个正则表达式。
在正则表达式方面,我是一个完全的初学者,所以如果有人能指出我正确的方向,那就太棒了。
您可以像这样组合正则表达式。
var a = 'something';
var b = '[a-z0-9]+';
var c = 'endwiththis$';
var regex = new RegExp(a+b+c) // /something[a-z0-9]+endwiththis$/
另一个例子...
var part1 = '^\d{1,3}\s[a-z]+';
var part2 = '\s .*(?=[m-s]+)';
var part3 = '.something$'
var combined = new RegExp(part1 ,part2,part3)
根据您的要求,我提出了一个解决方案,匹配所有应该留在捕获组中的所有内容,并匹配所有其他但不捕获的内容,因此替换或多或少是所有捕获组的总和(一些它们可能并且将会是空的)。我假设您有应作为一个整体转换的字符串,并且您不必太小心地验证它们。
最后的正则表达式模式是:
/^(?:dames|heren|schoenen us)\s+([a-z]*\s*)(?:([a-z]+)[\s/]*$|\D*(\d+)(?:[\s/]*$|(\s+\/\s+)\D*(\d+).*$))/i
并替换:
我使用不区分大小写来让它更短一些,但是如果你必须照顾 dAmEs
并以不同于 dames
的方式处理它,你将不得不删除 i
-修饰符并使用[Dd]ames
.
你可以找到一个演示 here
我用了gm
-修饰符来显示多个例子,你不需要使用它们。
尝试将所有案例尽可能合并为单一模式
function tr(str) {
return str.replace(/(?:Schoenen US |\w+ (US ))(?:[wW]?(\d+ \/ )[lL]?(\d+)|[wW]?(\d+) \/ |([lL]) \/)\s*$/, "");
}
console.log(tr("Schoenen US 30 / ")); // 30
console.log(tr("Dames US 30 / ")); // US 30;
console.log(tr("Dames US w30 / ")); //US 30
console.log(tr("Heren es US w30 / L34")); // US 30 / 34
console.log(tr("Dames US L / ")); // US L
希望这能帮助您理解正则表达式
我有一个字符串需要使用正则表达式进行更改。所以尝试了很多不同的东西,这就是我的接近程度。 以下是字符串可以是什么以及结果应该是什么的几个示例:
case A: "Schoenen US 30 / " should become -> "30"
case B: "Dames US 30 / " should become -> "US 30"
case C: "Dames US w30 / " should become -> "US 30"
case D: "Heren US w30 / L34" should become -> "US 30 / 34"
case E: "Dames US L / " should become -> "US L"
所以我需要做的是: 1.匹配部分:"Schoenen US "、"Dames "和"Heren "(所以包括结尾space)。 2. 匹配字符串中的任意"w"、"W"、"l"和"L"(需要去掉) 3. 只匹配字符串末尾的“/”(如果存在)
所以我想到了什么:
case A: "/\b(Dames[ ]|dames[ ]|Heren[ ]|heren[ ]|Schoenen US[ ]|[WwLl]).([0-9][0-9]).(\/ )/g" with substitution ""
case B & C: "/\b(Dames[ ]|dames[ ]|Heren[ ]|heren[ ]|Schoenen US[ ]|[WwLl]| \/ )/g" with empty substitution
case D: "/\b(Dames[ ]|dames[ ]|Heren[ ]|heren[ ]|Schoenen US[ ]|[WwLl])/g" with empty substitution
case E: No idea how to do this
这些正则表达式做我想做的事(当然 E 的情况除外)。但问题是我只能使用一个正则表达式,所以我需要以某种方式组合所有 4 个正则表达式。 在正则表达式方面,我是一个完全的初学者,所以如果有人能指出我正确的方向,那就太棒了。
您可以像这样组合正则表达式。
var a = 'something';
var b = '[a-z0-9]+';
var c = 'endwiththis$';
var regex = new RegExp(a+b+c) // /something[a-z0-9]+endwiththis$/
另一个例子...
var part1 = '^\d{1,3}\s[a-z]+';
var part2 = '\s .*(?=[m-s]+)';
var part3 = '.something$'
var combined = new RegExp(part1 ,part2,part3)
根据您的要求,我提出了一个解决方案,匹配所有应该留在捕获组中的所有内容,并匹配所有其他但不捕获的内容,因此替换或多或少是所有捕获组的总和(一些它们可能并且将会是空的)。我假设您有应作为一个整体转换的字符串,并且您不必太小心地验证它们。
最后的正则表达式模式是:
/^(?:dames|heren|schoenen us)\s+([a-z]*\s*)(?:([a-z]+)[\s/]*$|\D*(\d+)(?:[\s/]*$|(\s+\/\s+)\D*(\d+).*$))/i
并替换:
我使用不区分大小写来让它更短一些,但是如果你必须照顾 dAmEs
并以不同于 dames
的方式处理它,你将不得不删除 i
-修饰符并使用[Dd]ames
.
你可以找到一个演示 here
我用了gm
-修饰符来显示多个例子,你不需要使用它们。
尝试将所有案例尽可能合并为单一模式
function tr(str) {
return str.replace(/(?:Schoenen US |\w+ (US ))(?:[wW]?(\d+ \/ )[lL]?(\d+)|[wW]?(\d+) \/ |([lL]) \/)\s*$/, "");
}
console.log(tr("Schoenen US 30 / ")); // 30
console.log(tr("Dames US 30 / ")); // US 30;
console.log(tr("Dames US w30 / ")); //US 30
console.log(tr("Heren es US w30 / L34")); // US 30 / 34
console.log(tr("Dames US L / ")); // US L
希望这能帮助您理解正则表达式