2016-04-08 7 views
1

У меня есть строка, которую мне нужно изменить с помощью регулярного выражения. Так что попробовал много разных вещей, и вот как близко я пришел. Ниже приведены несколько примеров того, что строка может быть и что это тот случай, результат должен быть:Объедините несколько регулярных выражений

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 США»,» 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 

Эти регулярные выражения делать то, что я хочу (для случая Е Ofcourse исключением). Но проблема в том, что я могу использовать только одно регулярное выражение, поэтому мне как-то нужно объединить все 4 из них. Я полный новичок, когда дело доходит до регулярного выражения, поэтому, если кто-нибудь может указать мне в правильном направлении, это будет потрясающе.

+0

тест затем на [Regex101.com] (HTTP: //regex101.com/) –

+0

Есть несколько отличных тестовых сайтов регулярных выражений. Используя их, я дошел до того, что я описал в своем вопросе.Проблема в том, что я не знаю, как объединить различные решения, которые я мог придумать. – Tober

+0

Упрощение поможет вам увидеть общий шаблон, например '\ b (Dames [] | dames [] | Heren [] | heren [] | Schoenen US [] |. ([0-9] [0-9]). (\ /)/g' становится '\ b ([Dd] ames | [Hh] eren | Schoenen US) [] [WwLl] ([0-9] [0-9]). (\ /)/g' –

ответ

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 

Надеется, что это поможет вам понять, регулярного выражение

enter image description here

+0

Прошу прощения за мой поздний ответ. Большое спасибо за ваше решение и еще лучшее объяснение. В настоящее время я выясняю схему. – Tober

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

В зависимости от ваших требований, я пришел с решением, которое соответствует всем, что должно остаться в захватывающих групп и соответствует всем else, но не захватывает, поэтому замена является более или менее суммой всех захваченных групп (некоторые из них могут быть и будут пустыми). Я предполагаю, что у вас есть строки, которые должны быть преобразованы в целом и что вам не нужно слишком много заботиться о их проверке.

Наконец регулярное выражение картина:

/^(?: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 -Модификатор и использовать [Dd]ames.

Вы можете найти демо here

Я использовал gm -Modifier, чтобы показать несколько примеров, вы не должны использовать их.

+0

Большое спасибо за ваше великое разрешение. Я могу отметить только один ответ, как принято, и я мог бы действительно использовать объяснение nick, извините. – Tober