Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用正则表达式查找子字符串的开头和结尾_C#_Arrays_Regex_String - Fatal编程技术网

C# 使用正则表达式查找子字符串的开头和结尾

C# 使用正则表达式查找子字符串的开头和结尾,c#,arrays,regex,string,C#,Arrays,Regex,String,我在正则表达式方面的时间很长,所以在解析字符串时,我通常求助于糟糕的混乱和变通方法。我需要更好地使用正则表达式。这个对我来说似乎很简单,但我甚至不知道从哪里开始 以下是我的设备的字符串输出: testString = IP:192.168.5.210\rPlaylist:1\rEnable:On\rMode:HDMI\rLineIn:unbal\r 例如: 我想知道设备是关着还是开着。我需要搜索字符串“Enable:”,然后找到回车符并确定Enable:和\r之间的单词是关闭还是打开。似乎这就

我在正则表达式方面的时间很长,所以在解析字符串时,我通常求助于糟糕的混乱和变通方法。我需要更好地使用正则表达式。这个对我来说似乎很简单,但我甚至不知道从哪里开始

以下是我的设备的字符串输出:

testString = IP:192.168.5.210\rPlaylist:1\rEnable:On\rMode:HDMI\rLineIn:unbal\r
例如: 我想知道设备是关着还是开着。我需要搜索字符串“Enable:”,然后找到回车符并确定Enable:和\r之间的单词是关闭还是打开。似乎这就是regex的目的,或者我完全误解了它

有人能给我指出正确的方向吗

其他信息-也许我需要进一步说明这个问题

根据答案,确定设备是否启用似乎相当简单。因为我得到的返回字符串类似于键/值对,所以更麻烦的是确定:和回车之间的子字符串。其中许多对的响应长度差异很大,例如DeviceLocation、DeviceName、IPAddress。事实上,设备通过返回整个状态列表(48个键/值对)来响应发送给它的每个命令,然后我必须解析它们,即使我只需要知道一个属性

也基于你的回答。。。。正则表达式不是一个好办法

谢谢你的帮助。
Norm

考虑以下代码:

// This regular expression matches text 'Enabled: ' followed by one or more non '\r' followed by '\r'
// RegexOptions.Multiline is optional but MAY be necessary on other platforms.
// Also, '\r' is not a line break. '\n' is.
Regex regex = new Regex("Enable: ([^\r]+)\r", RegexOptions.Multiline);

string input = "IP:192.168.5.210\rPlaylist: 1\rEnable: On\rMode: HDMI\rLineIn: unbal\r";

var matches = regex.Match(input);
Debug.Assert(matches != Match.Empty);

// The match variable will contain 2 Groups:
// First will be 'Enabled: On\r'
// The other is 'On' since we enclosed ([^\r]+) in ().
Console.WriteLine(matches.Groups[1]);

我建议使用一个简单的行,如图所示,要求一个或另一个,但也要验证。部分基于Ken White的建议

if(input.Contains(":On")){
    //DoWork()
}else{
    if(input.Contains(":Off"))
        //DoOtherWork
}

这假定“:On”和“:Off”不会出现在字符串中的任何其他位置,即使是使用不同的字符串。

为什么需要在这个简单的问题上增加正则表达式不必要的复杂性?使用IndexOf查找Enable:,然后根据该索引位置+长度(“Enable:”)使用子字符串读取两个字符,这两个字符将为on或Of。如果您认为这是一种方法,请尝试。在发布时,你应该提供具体的代码示例,并在上面提问,而不是在空中提问。事实上,因为你处理的是一个简单的字符串,所以更简单。如果您知道它总是包含Enable:和On或Off,只需使用
IndexOf(':On')
。如果结果>0,则启用;如果是0,则不是。完成。一行简短的代码。@KenWhite——别误会我的意思,我想在执行此任务时尽可能远离正则表达式。因为我对它知之甚少,我想知道这是否是我的方向。根据评论,我认为不是。根据其他信息,您应该使用此字符串中固有的键/值对。根据所需的任何可能值执行此操作
string[]testReturn=testString.Split('\r');foreach(testReturn中的字符串a){if(itemSearch==a.Split(':')[0])//使用a.Split(':')[1]作为define
的值,请注意您的输入有额外的空格,可能是通过将
IP:192.168.5.210\rPlaylist:1\rEnable:On\rMode:HDMI\rLineIn:unbal\r
粘贴到visual studio中,然后添加引号。如果您从引号开始并粘贴到其中,则不会添加空格。