无法从Javascript中的While循环获取输出
我正在进行2017年冬季季度的最后一个项目,演示如何在页面后面的C#和JavaScript代码中使用正则表达式。我已经完成了演示程序的C#版本,但是JavaScript版本让我把我头上剩下的一点点头发拔了出来(自从我今天早上新剪了一个发型以来,这是一个不小的成就!)。问题涉及在While循环中应用正则表达式以获取表达式的每个实例并将其打印出来后,无法获得任何输出 在我的HTML页面上,我有一个输入文本区域、七个单选按钮、一个输出文本区域和下面的两个按钮(一个按钮用于将输出文本移动到输入区域以执行应用表达式的多次迭代,另一个按钮用于清除所有文本区域以从头开始)。每个单选按钮都链接到一个函数,该函数将正则表达式应用于输入区域中的文本。我的七项职能中有五项工作;第六个是我想不出来的,第七个基本上是相同的,但是有一个稍微不同的正则表达式模式,所以如果我修复第六个函数,第七个函数将是一个快照 (我试图插入/上传前端的JPG,但照片上传似乎不起作用。希望你了解我设置的大意。) 以下是我的JS代码隐藏中的问题儿童:无法从Javascript中的While循环获取输出,javascript,regex,loops,output,stringbuilder,Javascript,Regex,Loops,Output,Stringbuilder,我正在进行2017年冬季季度的最后一个项目,演示如何在页面后面的C#和JavaScript代码中使用正则表达式。我已经完成了演示程序的C#版本,但是JavaScript版本让我把我头上剩下的一点点头发拔了出来(自从我今天早上新剪了一个发型以来,这是一个不小的成就!)。问题涉及在While循环中应用正则表达式以获取表达式的每个实例并将其打印出来后,无法获得任何输出 在我的HTML页面上,我有一个输入文本区域、七个单选按钮、一个输出文本区域和下面的两个按钮(一个按钮用于将输出文本移动到输入区域以执行
// RegEx_Demo_JS.js - code behind for RegEx_Demo_JS
var inputString; // Global variable for the input from the input text box.
var pattern; // Global variable for the regular expression.
var result; // Global variable for the result of applying the regular expression to the user input.
// Initializes a new instance of the StringBuilder class
// and appends the given value if supplied
function StringBuilder()
{
var strings = [];
this.append = function (string)
{
string = verify(string);
if (string.length > 0) strings[strings.length] = string;
}
this.appendLine = function (string)
{
string = verify(string);
if (this.isEmpty())
{
if (string.length > 0) strings[strings.length] = string;
else return;
}
else strings[strings.length] = string.length > 0 ? "\r\n" + string : "\r\n";
}
this.clear = function () { strings = []; };
this.isEmpty = function () { return strings.length == 0; };
this.toString = function () { return strings.join(""); };
var verify = function (string)
{
if (!defined(string)) return "";
if (getType(string) != getType(new String())) return String(string);
return string;
}
var defined = function (el)
{
// Changed per Ryan O'Hara's comment:
return el != null && typeof(el) != "undefined";
}
var getType = function (instance)
{
if (!defined(instance.constructor)) throw Error("Unexpected object type");
var type = String(instance.constructor).match(/function\s+(\w+)/);
return defined(type) ? type[1] : "undefined";
}
}
在第二个单选按钮(这将是第七个也是最后一个要完成的函数)的代码中,我使用局部变量中的数据测试了ScriptBuilder,它成功运行并生成输出到output textarea。但我没有从调用While循环的下一个函数得到任何输出:
function RegEx_Match_TheOnly_AllInstances()
{
inputString = document.getElementById("txtUserInput").value;
pattern = /(\s+the\s+)/ig; // Using an Flag (/i) to select either lowercase or uppercase version. Finds first occurrence either as a standalone word or inside a word.
//result = pattern.exec(inputString); // Finds the first index location
var arrResult; // Array for the results of the search.
var sb = getStringBuilder(); // Variable to hold iterations of the result and the text
while ((arrResult = pattern.exec(inputString)) !==null)
{
sb.appendLine = "Match: " + arrResult[0] ;
}
document.getElementById("txtRegExOutput").value = sb.toString();
/* Original code from C# version:
// string pattern = @"\s+(?i)the\s+"; // Same as above, but using Option construct for case insensitive search.
string pattern = @"(^|\s+)(?i)the(\W|\s+)";
MatchCollection matches = Regex.Matches(userTextInput, pattern);
StringBuilder outputString = new StringBuilder();
foreach (Match match in matches)
{
string outputRegExs = "Match: " + "\"" + match.Value + "\"" + " at index [" + match.Index + ","
+ (match.Index + match.Length) + "]" + "\n";
outputString.Append(outputRegExs);
}
txtRegExOutput.Text = outputString.ToString();
*/
} // End RegEx_Match_The_AllInstances
我留下了注释代码,以展示我在C#code behind版本中使用的内容,以说明我试图实现的目标
用于此函数的测试输入/字符串I为:
不要去那里。如果你想成为男人,你必须打败男人
那应该会有两次命中。理想情况下,我想让它显示它找到的单词和它找到单词的索引,但在这一点上,我很乐意得到一些显示它找到的每个实例的输出,然后用索引和可能的最后一个索引来构建它
那么,我的While循环中的问题是我应用StringBuilder的方式,还是两者的结合?我知道StringBuilder代码是有效的,至少在没有在循环中使用的情况下,并且使用了我发现该代码的站点中的一些测试数据。简单地将“the”的第一个实例作为独立实例或在另一个单词中查找的代码可以工作并返回输出,但不使用循环
我通过Stack Overflow和其他几个JavaScript网站寻找灵感,但到目前为止,我所做的任何尝试都没有奏效。我感谢任何人能提供的帮助!(如果您需要我发布任何其他代码,请提供建议,我很乐意为您效劳。)这并不能真正解决您的问题,只是为了让您知道您正在进行太多的类型检查。JavaScript不应该像Java那样编程;不需要执行类似于
if(getType(string)!=getType(newstring())的返回字符串(string)代码>.appendLine
是一个函数/方法。在循环中,您需要使用sb.appendLine()
调用它,而不是使用=
为它赋值。另外,什么是getStringBuilder()
?该函数在while
之前调用,但未显示函数定义。是不是应该是sb=new StringBuilder()
?可能我已经复制和粘贴了很多次尝试不同的东西,都搞砸了。这就是为什么我希望有人能纠正我!正如NNNN所建议的,我在实现JS StringBuilder时修复了这些问题。它还没有打印出来。我开始认为真正的问题是如何实现循环,或者应该使用match而不是exec。毕竟,在C#版本中,我使用了匹配而不是exec方法。在阅读一些关于JavaScript中的循环和正则表达式的内容时,他们让我觉得应该使用exec而不是match。让我试试这个。看来我解决了我的问题。我从循环函数中删除了旧代码,这样我就可以用干净的代码重新开始。以下是最终奏效的方法:var sb=new StringBuilder();inputString=document.getElementById(“txtUserInput”).value;pattern=/\s+the\s+/ig;结果=空;while((result=pattern.exec(inputString))!=null){sb.appendLine(“匹配:”+“\”+结果[0]+“\”+”在索引“+”[“+result.index+”]);}document.getElementById(“txtregeOutput”).value=sb.toString();