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中,然后添加引号。如果您从引号开始并粘贴到其中,则不会添加空格。