我正在尝试将一段Javascript转换为.NET,但我似乎无法完全正确。
这是一个在Express for NodeJs中调用的方法。它将/test/:value1/:value2
之类的路径转换为正则表达式,可以在URL的一部分上使用。
/**
* Normalize the given path string,
* returning a regular expression.
*
* An empty array should be passed,
* which will contain the placeholder
* key names. For example "/user/:id" will
* then contain ["id"].
*
* @param {String|RegExp|Array} path
* @param {Array} keys
* @param {Boolean} sensitive
* @param {Boolean} strict
* @return {RegExp}
* @api private
*/
exports.pathRegexp = function(path, keys, sensitive, strict) {
if (path instanceof RegExp) return path;
if (Array.isArray(path)) path = '(' + path.join('|') + ')';
path = path
.concat(strict ? '' : '/?')
.replace(/\/\(/g, '(?:/')
.replace(/(\/)?(\.)?:(\w+)(?:(\(.*?\)))?(\?)?(\*)?/g, function(_, slash, format, key, capture, optional, star){
keys.push({ name: key, optional: !! optional });
slash = slash || '';
return ''
+ (optional ? '' : slash)
+ '(?:'
+ (optional ? slash : '')
+ (format || '') + (capture || (format && '([^/.]+?)' || '([^/]+?)')) + ')'
+ (optional || '')
+ (star ? '(/*)?' : '');
})
.replace(/([\/.])/g, '\\$1')
.replace(/\*/g, '(.*)');
return new RegExp('^' + path + '$', sensitive ? '' : 'i');
}
我尝试将其转换为:
private Regex ConvertPathToRegex(string path, bool strict, out List<string> keys) {
keys = new List<string>();
List<string> tempKeys = new List<string>();
string tempPath = path;
if (strict)
tempPath += "/?";
tempPath = Regex.Replace(tempPath, @"/\/\(", delegate(Match m) {
return "(?:/";
});
tempPath = Regex.Replace(tempPath, @"/(\/)?(\.)?:(\w+)(?:(\(.*?\)))?(\?)?(\*)?", delegate(Match m) {
string slash = (!m.Groups[1].Success) ? "" : m.Groups[1].Value;
bool formatSuccess = m.Groups[2].Success;
string format = (!m.Groups[2].Success) ? "" : m.Groups[2].Value;
string key = m.Groups[3].Value;
bool captureSuccess = m.Groups[4].Success;
string capture = m.Groups[4].Value;
bool optional = m.Groups[5].Success;
bool star = m.Groups[6].Success;
tempKeys.Add(key);
string expression = "/";
expression += (optional ? "" : slash);
expression += "(?:";
expression += (optional ? slash : "");
expression += (formatSuccess ? format : "");
expression += (captureSuccess ? capture : (formatSuccess ? format + "([^/.]+?" : "([^/]+?)")) + ")";
expression += (star ? "(/*)" : "");
return expression;
});
tempPath = Regex.Replace(tempPath, @"/([\/.])", @"\$1");
tempPath = Regex.Replace(tempPath, @"/\*", "(.*)");
tempPath = "^" + tempPath + "$";
keys.AddRange(tempKeys);
return new Regex(tempPath, RegexOptions.Singleline | RegexOptions.IgnoreCase);
}
但问题是,此方法无法正常运行。因为我不是一个正常的表达超级明星,我想知道我是否能得到一些帮助。
当您添加?param=1
时,该方法会以某种方式搞砸。
编辑:当我第一次从路径中删除查询参数时,它实际上工作得很好。
很抱歉,问题的答案只是从网址中删除查询参数。
答案 0 :(得分:0)
我在PHP中创建了这个端口,也许它可以帮助你以某种方式更好地理解表达式的作用,它会返回一个正则表达式来匹配params。
<?php
public static function pathRegexp($path, array &$keys, $sensitive = false, $strict = false)
{
if (is_array($path)) {
$path = '(' . implode('|', $path) . ')';
}
$path = (($strict === true) ? $path : (rtrim($path, '/ ') . '/?'));
$path = preg_replace('/\/\(/', '(?:/', $path);
$path = preg_replace_callback('/(\/)?(\.)?:(\w+)(?:(\(.*?\)))?(\?)?(\*)?/', function($matches) use(&$keys) {
$slash = (isset($matches[1]) ? $matches[1] : "");
$format = (isset($matches[2]) ? $matches[2] : false);
$key = (isset($matches[3]) ? $matches[3] : null);
$capture = (isset($matches[4]) ? $matches[4] : false);
$optional = (isset($matches[5]) ? $matches[5] : false);
$star = (isset($matches[6]) ? $matches[6] : false);
array_push($keys, array("name" => $key, "optional" => (!!$optional)));
return ''
. ($optional ? '' : $slash)
. '(?:'
. ($optional ? $slash : '')
. ($format ? $format : '')
. ($capture ? $capture : ($format ? '([^/.]+?)' : '([^/]+?)')) . ')'
. ($optional ? $optional : '')
. ($star ? '(/*)?' : '');
}, $path);
$path = preg_replace('/([\/.])/', '\\/', $path);
$path = preg_replace('/\*/', '(.*)', $path);
$path = '/^' . $path . '$/' . ($sensitive ? '' : 'i');
return $path;
}