0

我有一个字符串数组存储用户输入,我想检查输入用户是否只包含特定的单词END,我不介意单词之前或之后是否有空格,例如用户可以输入类似END或“END”或“END”或“END”的单词。我真的不在乎单词之前或之后有多少空格我只想检查输入字符串是否只包含单词END而不考虑空格。

我试过了

Regex regex_ending_char = new Regex(@"^END|^\s+END$|^END+\s$");
// to compare the word "END" only nothing before it nor after it - 
// space is of anywhere before or after the word

Match Char_Instruction_match = regex_ending_char.Match(Instruction_Separator[0]);
if (!Char_Instruction_match.Success) // True if word doesn't end with "END"
{
    richTextBox2.Text += "Error in line " + (LineNumber + 1) + ",  Code must end with 'END'" + Environment.NewLine;
}`

我也试过

Regex regex_ending_char = new Regex(@"^END|^\s+END$|^END+\s$"); 
// to compare the word "END" only nothing before it nor after 
// it - space is of anywhere before or after the word

Regex.Replace(Instruction_Separator[0], @"\s+", "");
Match Char_Instruction_match = regex_ending_char.Match(Instruction_Separator[0]);
if (!Char_Instruction_match.Success) // True if word doesn't end with "END"
{
    richTextBox2.Text += "Error in line " + (LineNumber + 1) + ",  Code must end with 'END'" + Environment.NewLine;
}`

问题是我只需要检查数组的第一个元素Instruction_Separator[0]而不是任何其他元素。END因此,如果用户在“END”之类的单词之前输入一个空格,那么Instruction_Separator数组就变成Instruction_Separator[0] = " ", Instruction_Separator[1] = END了,因此即使用户输入了正确的字符串,代码也会进入 if 条件,他只在开头输入了一个空格,我没有问题如果单词前后有空格。

谢谢大家的回复,我尊重大家的回答。我要做的是构建一个汇编器,我必须检查语法错误,并且用户输入中的注释是可以的。例如,如果用户输入如下:

ORG 100 //Begin at memory location 100
LDA A // Load A
A, DEC 83 // A has a decimal value of 83
END // End the code

那么没有任何语法错误,我可以给出一个结果。

此外,如果用户在每行之前添加空格,那也没关系

ORG 100 //Begin at memory location 100
    LDA A // Load A
    A, DEC 83 // A has a decimal value of 83
         END // End the code

所以我想检查每一行是否包含正确的语法,我并不关心每一行的正确格式之前或之后的任何空格。

用户语法错误类似于:

OR G 100 //Begin at memory location 100
LDA A // Load A
A, DEC 83 // A has a decimal value of 83
EN  To end the code

请注意,ORG 写成“OR G”,这是错误的,END 也写成“EN”,用户忘记在注释“结束代码”之前放置“//”

所以我需要做的是检查最后一行是否包含“END”这个词,如果有“//”那么它后面的内容是注释。但是如果用户想在一行中添加注释,他必须输入“//”。如果他不想添加评论,那不是必须的。任何想法我如何使用正则表达式来做到这一点,正如我上面提到的我试过Regex regex_ending_char = new Regex(@"^END|^\s+END$|^END+\s$");但我似乎没有正确工作

提前感谢您的回复。

4

4 回答 4

3

我也不会使用正则表达式。实际上:

bool b = input.Trim() == "END"

也可以工作!如果通过“空格”,您还想包含其他空格。

否则:

bool b = input.Replace(" ", "") == "END"

但是,我想如果你绝对必须在那里有一个正则表达式......试试:

^\s*END\s*(//.*)?$

用作:

Regex regex_ending_char = new Regex(@"^\s*END\s*(//.*)?$"); 

那么那里发生了什么?这只是绝对的基本正则表达式......

  • ^匹配字符串的开头
  • \s*匹配零个或多个空格
  • END匹配所需的字符串“END”
  • \s*如果你愿意,你可以在之后有空格......
  • (//.*)?匹配可选的两个斜杠组,后跟零个或多个字符
  • $匹配字符串的结尾
于 2013-05-30T09:14:33.003 回答
1

根据相关编辑更新答案

你仍然不需要正则表达式。它可以通过基本的字符串操作来完成。

bool b = input.Split(new string[] { "//" },
                     StringSplitOptions.RemoveEmptyEntries)[0].Trim() == "END";
于 2013-05-30T09:12:37.550 回答
0

同样,这是一个很好的例子,说明使用正则表达式是个坏主意。只需使用以下代码即可满足此要求:

var stringToTest = "Something that ends with END  ";
var valid = stringToTest
    .TrimEnd(' ')
    .EndsWith("END", StringComparison.CurrentCultureIgnoreCase); 
于 2013-05-30T09:13:47.243 回答
0

不需要正则表达式:

bool ok = input.Trim() == "END";
于 2013-05-30T09:14:25.297 回答