复杂的拆分正则表达式

3

问题

我在正则表达式方面遇到了麻烦。

我有一组字符串。

示例字符串

@param* URL url './' an absolute URL giving the base location of the image
@param* Function callback callback(indexInArray, valueOfElement) The function that will be executed on every object.
@param Function callback Null The function that will be executed when the image is clicked
@param String name 'this is a test name' the name to use when displaying the image
@param String name "this is a test name" the name to use when displaying the image

我将它们按照换行符分割,以便得到单独的字符串。
var match = val.split("\n");

每个字符串都可以分解为五个值:

变量

例如:@param Function callback Null 当图像被点击时将执行的函数

@param = required;
Function = type;
callback = name;
Null = default;
The function that will be executed when the image is clicked = description.

我需要做的是将这个字符串分解成其部分,考虑到所有不同的字符串可能性,我很难创建一个可以在所有不同的默认值和描述可能性上拆分的正则表达式。
当defaultValue是双引号或单引号中的字符串或者函数符号时,我尤其难以取出它。
代码
这是我的当前工作代码;
$.each(match, function(index, value) {
    var part = value.split(/\s/); //TODO need a regx to split this string correctly

    var required     = part[0];
    var type         = part[1];
    var name         = part[2];
    var defaultValue = part[3];
    var description  = part[4];
});

总结

我需要一个单步或多步的正则表达式,可以将所有上面五个示例拆分成同样的五个变量。

编辑:我很抱歉没有尝试过正则表达式,但是我不确定从哪里开始。


第一部分是否总是以“@”开头?此外,前三个部分中的任何一个都可以超过一个单词吗? - Tom Pietrosanti
是的,第一部分始终以@开头,前三个值始终为单词。 - Levi Putna
2个回答

2

这段代码没有使用正则表达式,但我认为它更容易理解和维护。此外,我相信有一种更优雅的方法来执行if语句,但这是我在短时间内想到的。 http://jsfiddle.net/CcAus/

$.each(match, function(index, value) {
    var part = value.split(' ');

    var required     = part.shift();
    var type         = part.shift();
    var name         = part.shift();
    if(part[0][0]=='\''||part[0][0]=='"'){
      part = part.join(' ');
      var defaultValue = part.split(part[0][0]+' ',1)+part[0][0];
      part=part.replace(defaultValue,'')
      var description = part;
    }
    else{
      var defaultValue = part.shift();
      var description = part.join(' ');
    }
});

+1 - 这里唯一无法处理的是默认值中的转义引号,但这在这里不一定是问题。 - Niet the Dark Absol
谢谢,这个很好用,除非默认值是一个函数回调(indexInArray,valueOfElement)http://jsfiddle.net/leviputna/h5vB4/1/ 我正在尝试找到解决方法。 - Levi Putna

1

试试这个:

var regExp = /^(@.+?)\s(.+?)\s(.+?)\s(\'.+?\'|\".+?\"|\w.+?\)|\w+?)\s(.*)$/;
results = regExp.exec(value);

var required     = results[0];
var type         = results[1];
var name         = results[2];
var defaultValue = results[3];
var description  = results[4];

我快速测试了一下http://regexhero.net/tester/,但除此之外我没有进行任何测试。


+1 我不得不将结果数组更改为从一开始,但这似乎很好用,我进行了一个小测试 http://jsfiddle.net/leviputna/J28ms/ ,你可以看到它在运行。 - Levi Putna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接