【问题标题】:Regex: problem creating matching pattern正则表达式:创建匹配模式的问题
【发布时间】:2009-02-27 07:17:12
【问题描述】:

在找出与此匹配的正则表达式时遇到一些问题:

function Array() { [native code] }

我正在尝试仅匹配将出现在“Array”所在位置的文本。

【问题讨论】:

  • 我觉得你的问题很不清楚。
  • 这是我的字符串。 “数组”所在的文本将会改变。所以我正在努力匹配。
  • 所以您尝试匹配“function”和“()”之间的文本?
  • 我认为你最终应该接受 Helephant 的回答(因为你已经说过它解决了你的问题)。

标签: javascript regex


【解决方案1】:

您是否试图找出 javascript 中变量的类型?如果这就是你想要的,你可以将对象的构造函数与你认为创建它的构造函数进行比较:

var array = new Array();
if(array.constructor == Array)
    alert("Is an array");
else
    alert("isn't an array");

这并不是用 javascript 处理事情的最佳方式。 Javascript 没有像 C# 那样的类型系统,它可以保证如果变量是由某个构造函数创建的,那么它将具有某些成员,因为 javascript 是一种非常动态的语言,对象从其构造函数中获取的任何内容都可以在运行时被覆盖。

相反,最好使用鸭子类型并询问您的对象它们可以做什么而不是它们是什么: http://en.wikipedia.org/wiki/Duck_typing

if(typeof(array.push) != "undefined")
{
    // do something with length
    alert("can push items onto variable");
}

【讨论】:

  • 这实际上帮助我解决了我正在尝试的问题。感谢您阅读我所要求的内容以了解我的意图。
【解决方案2】:

在 Perl 中,你会使用:

m/^\s*function\s+(\w+)\s*\(/;

变量“$1”将捕获函数名称。

如果function 关键字可能不在行首,那么您必须(稍微)更加努力。

[编辑:添加了两个“\s*”序列。]


关于这是否有效的问题......这是我的测试用例:

测试脚本:

while (<>)
{
    print "$1\n" if (m/^\s*function\s+(\w+)\s*\(/);
}

测试输入行(是的,故意错位):

function Array() { ... }
 function   Array2   () { ... }
func Array(22) { ... }

测试输出:

Array
Array2

在 Solaris 10 (SPARC) 上使用 Perl 5.10.0 进行测试:我不认为平台或版本是一个重要因素 - 我希望它在任何可能的 Perl 版本上都能正常工作。

【讨论】:

  • 在开头添加 \s* 有那么难吗?在 (\w+) 和 ( ?
  • 既然每个人都在吹毛求疵 ;) 为什么要包括 ^ 和 \s* 呢?不需要这个约束,一个简单的 \bfunction 来指示单词边界就可以了。最后的 \s* 也是不需要的,为什么要关心比赛后面的内容?
  • 插入符号避免了函数出现在字符串或 cmets 中的问题,或者......它并不完美。末尾的 \s* 允许名称后和左括号前有空格。如果不存在模棱两可的风险('function Ambiguous works'),那么可以。问题范围不完全清楚。
  • 我一直在尝试这个,但没有让它工作。它仍然匹配“功能”。
  • @Tomalak - 我不希望正则表达式匹配“function Bad Code()”,因为有人不小心写了一个带空格的函数名。它应该寻找括号以确保该函数至少具有良好的语法。不过,这只是我的看法。
【解决方案3】:

所以后来,我得到了这个几乎可以工作的:

[function\s]((\S+)+)(?=\(\))

不过还是匹配Array前面的空格

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    相关资源
    最近更新 更多