2015-09-01 15 views
-4

我正在使用JavaScript来包含文本框和文本区域。按钮 - 调用一个函数来确定文本框中的字符串是否在textarea的内容中找到。自然,如果找到字符串,则向用户发送消息。为什么我不能在a// g中调用var;

这里是我的代码:

HTML

<textarea id="textbox3" rows="4" cols="50"></textarea>  
<input id="text3" value="" /> 
<button id="findTextButton" onclick="findText();"> 
    #2 Find text from textbox in textarea 
</button> 

的JavaScript

function findText() { 
    var txtThree = document.getElementById("textbox3").value; 
    var searchWord = document.getElementById("text3").innerHTML.value; 
    var globalSearch = /[a-z]/g; 
    var deliver = txtThree.match(globalSearch); 
    if (searchWord === "") { 
     alert("Please Enter Text"); 
    } else { 
     alert(deliver); 
    } 

} 

我想要做的是在globalSearch函数中调用的变量搜索内容,但它不会让我这样做。

+0

这段代码没有任何意义,因为'searchWord'从来没有被有意义地使用或在'globalSearch'的上下文中使用。如果你问为什么* interpolation *不起作用。那么,这是因为Java不支持插值(但是甚至没有在“示例”代码中显示)。 – user2864740

+0

我刚刚意识到这一点,因为我正在阅读您的回复。任何帮助将是伟大的,我肯定错过了什么.. –

+1

@ user2864740,这是JavaScript,而不是Java(但你的观点仍然站在) –

回答

0

在你的代码中,globalSearch是一个正则表达式literal,它永远不会改变,并且总会找到同样的东西。表达式/[a-z]/g表示在az之间找到单个字符。 g修饰符使其成为global search,这意味着即使在找到第一个匹配项后它也会继续搜索和匹配。

因此,当您运行txtThree.match(globalSearch)时,match将返回一个包含txtThree中所有字母的单字符字符串数组。例如,如果txtThree包含字符串'This is a test.'它将返回阵列[ "h", "i", "s", "i", "s", "a", "t", "e", "s", "t" ]

您不能使用RegExp文字来搜索不同的内容。但是,您可以使用RegExp constructor function生成一个动态的RegExp,一旦你有你的searchWord

var rxSearch = new RegExp(searchWord); 
var result = txtThree.match(rxSearch); 

您可以提供g改性剂中的第二个参数RegExp的标志之一,但因为你只是想确定如果字符串在里面有所有,你一旦找到它就不需要继续搜索。

match或者返回匹配的数组(一个单元素数组在这种情况下,因为我们没有使用g改性剂)或null如果一个匹配没有被发现。由于arrays are truthy and nulls are falsey我们可以使用resultif语句来测试是否任何发现:

if (result) { 
    alert('Found somthing!'); 
} else { 
    alert('It\'s not there.'); 
} 

由于Buildersrejected points out,正则表达式是矫枉过正的这种局面一点点。是我处理这个问题从头开始,我可能会使用indexOf代替:

if (txtThree.indexOf(searchWord) !== -1) { 
    alert('Found somthing!'); 
} else { 
    alert('It\'s not there.'); 
} 

在这种情况下的表现其实并不重要,但如果它没有,使用indexOf会比期运用search更快。 indexOf实际上需要一个普通的字符串作为参数,search需要一个正则表达式,如果提供了一个字符串,它会在使用之前转换为正则表达式。

1

好吧,我想我得到你想要的东西....你有一个textarea和一个文本输入框。你想抓取输入框中的文本,看看textarea内是否有匹配?

除非您打算做更复杂的事情,否则您不应该需要RegExp。 .search()可以采用RegExp或String。(在这种情况下,来自“text3”的值)。 此外您还可以检查searchWord是否太早空。如果Javascript遇到一个错误,整个事情就会关闭。

function findText() { 
    var txtThree = document.getElementById("textbox3").value; 
    //var searchWord = document.getElementById("text3").innerHTML.value; 
    //Take away the .innerHTML above 
    var searchWord = document.getElementById("text3").value; 
    //var globalSearch = /[a-z]/g; 
    //You shouldn't need a RegExp. 


    if (searchWord === "") { 
     alert("Please Enter Text"); 
    } else { 
     var deliver = txtThree.match(searchWord); 
     alert(deliver); 
    } 
} 

我测试了这个,它对我来说工作正常。如果这是你所期待的。

我会补充说@UselessCode使用新的RegExp(searchWord)的答案是一个好主意。

+0

完美!我很困惑,这很简单,我不相信我没有看到它。 –

+0

同意,如果不需要,不应使用RegEx。我通常会使用'indexOf'而不是'search'。 ['搜索'实际上是将你的字符串转换成RegExp](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/search#Parameters),然后再进行搜索。 –

相关问题