我有一个字符串,我需要使用正则表达式进行更改。所以尝试了很多不同的东西,这就是我的亲密程度。 下面是字符串可以是什么以及结果应该是什么情况的一些示例:
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”(包括结束空间)。 2.匹配字符串中的任何“w”,“W”,“l”和“L”(需要删除) 3.仅在字符串末尾匹配“/”(如果存在)
所以我想出了:
case A: "/\b(Dames[ ]|dames[ ]|Heren[ ]|heren[ ]|Schoenen US[ ]|[WwLl]).([0-9][0-9]).(\/ )/g" with substitution "$2"
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 ofcourse)。但问题是我只能使用一个正则表达式,所以我需要将它们中的所有4个结合起来。 当谈到正则表达式时,我是一个完全的初学者,所以如果有人能指出我正确的方向会很棒。
答案 0 :(得分:1)
你可以像这样组合正则表达式。
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)
答案 1 :(得分:1)
根据您的要求,我提出了一个解决方案,该解决方案可以匹配捕获组中的所有内容并匹配其他所有但未捕获的内容,因此替换或多或少是所有捕获组的总和(其中一些可能并且将是空的)。我假设你有一些字符串应该作为一个整体进行转换,你不需要太在意它们来验证它们。
最后正则表达式是:
/^(?:dames|heren|schoenen us)\s+([a-z]*\s*)(?:([a-z]+)[\s/]*$|\D*(\d+)(?:[\s/]*$|(\s+\/\s+)\D*(\d+).*$))/i
替换:
$1$2$3$4$5
我使用不区分大小写来缩短它,如果你必须处理dAmEs
并以dames
之外的其他方式处理它,你必须删除i
} -Modifier并使用[Dd]ames
。
您可以找到演示here
我使用gm
- 修饰符来显示多个示例,您不需要使用它们。
答案 2 :(得分:1)
尝试尽可能接近地将所有案例合并为单一模式
function tr(str) {
return str.replace(/(?:Schoenen US |\w+ (US ))(?:[wW]?(\d+ \/ )[lL]?(\d+)|[wW]?(\d+) \/ |([lL]) \/)\s*$/, "$1$2$3$4$5");
}
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
希望这有助于您了解正则表达式