В Javascript RegExp нет встроенного способа; без изменения вашего выражения. Самое близкое, что вы можете получить, это source
, который просто вернет все выражение в виде строки.
Поскольку вы знаете, что выражение представляет собой серию | OR
с, вы могли бы захватить группы, чтобы выяснить, какие группы совпадают, и объединить, что с .source
, чтобы узнать содержимое этой группы:
var exp = /(horse)|(caMel)|(TORTOISe)/i;
var result = exp.exec("Camel");
var match = function(){
for(var i = 1; i < result.length; i++){
if(result[i]){
return exp.source.match(new RegExp('(?:[^(]*\\((?!\\?\\:)){' + i + '}([^)]*)'))[1];
}
}
}();
// match == caMel
Также чрезвычайно легко (хотя и несколько непрактично) написать RegExp-движок с нуля, вы могли бы технически добавить эту функциональность. Это будет намного медленнее, чем использование реального объекта RegExp, поскольку весь движок должен интерпретироваться во время выполнения. Тем не менее, он мог бы возвращать точно подобранную часть выражения для любого регулярного выражения и не ограничиваться тем, что состоит из серии | OR
.
Лучший способ решить проблему, однако, вероятно, не использовать цикл или регулярное выражение на всех, но вместо того, чтобы создать объект, где вы используете каноническую форму для ключа:
var matches = {
'horse': 'horse',
'camel': 'caMel',
'tortoise': 'TORTOISe'
};
// Test "Camel"
matches['Camel'.toLowerCase()]; // "caMel"
Чтобы быть ясным, вы пытаетесь вернуть регулярное выражение, а не строку со строкой? – Mathletics
Исходя из этого примера, он вернул то, что соответствовало. Вы явно сказали регулярному выражению, чтобы игнорировать текст ** ** и ** верблюд ** соответствовали этому. Таким образом, он вернул ввод строки. –