我正在开发2017年冬季季度的最终项目,以演示如何在页面后面的C#和JavaScript代码中使用正则表达式。我已经完成了我的演示程序的C#版本,但JavaScript版本让我拉开了我头上留下的一点点头发(因为今天早上我收到了新鲜的嗡嗡声,这是一个不小的成就!)。问题涉及在While循环中应用正则表达式后获取任何输出以获取表达式的每个实例并将其打印出来。
在我的HTML页面上,我有一个输入textarea,七个单选按钮,一个输出文本区域和下面的两个按钮(一个按钮用于将输出文本移动到输入区域以执行应用表达式的多次迭代,另一个按钮清除所有textareas从头开始)。每个单选按钮链接到一个函数,该函数将正则表达式应用于输入区域中的文本。我的七个职能中有五个有效;第六个是我无法弄清楚的,第七个基本相同,但RegEx模式略有不同,所以如果我修复第六个函数,第七个函数将是一个快照。
(我试图插入/上传前端的JPG,但照片上传似乎无法正常工作。希望你能够摆脱我设置的内容。)
以下是我的JS代码背后的问题:
// 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,并且它成功运行并将输出生成到输出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#代码背后版本中使用的内容,以说明我想要完成的内容。
我用于此功能的测试输入/字符串是:
不要去那里。如果你想成为男人,你必须打败男人。
那应该返回两个命中。理想情况下,我希望它能够显示它找到的单词以及它找到单词的索引,但是此时我很乐意只获得一些输出显示它找到的每个实例,然后使用index和可能的lastIndex。
那么,我的问题在于我的While循环,我应用StringBuilder的方式,还是两者的结合?我知道StringBuilder代码是有效的,至少在没有在循环中使用并使用来自站点的一些测试数据时我发现了代码。以及简单查找""的第一个实例的代码作为一个单独的或在另一个单词内部确实起作用并返回输出,但是它不会使用循环。
我已经通过Stack Overflow和其他几个JavaScript网站寻找灵感,但到目前为止我所做的一切都没有效果。我感谢任何人都能提供的帮助! (如果您需要我发布任何其他代码,请提出建议,我很乐意帮忙。)