- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我的代码的摘录:
string[] myStr =
{
" Line1: active 56:09 - tst0063, tst0063",
"Contacts accosiated with line 1 - tst0063, tst0063",
"Line 1: 00:00:32 Wrap: 00:00:20 - tst0063, tst0063",
"Line 1: 00:00:17 Active: 00:00:15 - tst0064, tst0064"
};
string sPattern = @"^Line(\s*\S*)*tst0063$";
RegexOptions options = RegexOptions.IgnoreCase;
foreach (string s in myStr)
{
System.Console.Write(s);
if (System.Text.RegularExpressions.Regex.IsMatch(s, sPattern, options))
{
System.Console.WriteLine(" - valid");
}
else
{
System.Console.WriteLine(" - invalid");
}
System.Console.ReadLine();
}
RegularExpressions.Regex.IsMatch 在处理最后一行时挂起。我做了一些实验,但仍然不明白为什么当行尾没有匹配时它会挂起。请帮忙!
最佳答案
问题不是为什么第四个测试挂起,而是为什么前三个没有挂起。第一个字符串以空格开头,第二个字符串以 Contacts
开头,两者都不匹配正则表达式 ^Line
,因此前两次匹配尝试立即失败。第三个字符串匹配正则表达式;虽然它比它应该花费的时间长得多(出于我将要解释的原因),它似乎仍然是瞬间的。
第四次匹配失败,因为字符串与正则表达式的结尾部分不匹配:tst0063$
。当失败时,正则表达式引擎将备份到正则表达式的可变部分 (\s*\S*)*
,并开始尝试所有不同的方式将其放入字符串中。与第三个字符串不同,这次它必须尝试零个或多个空白字符 (\s*
) 后跟零个或多个非空白字符 (\S*
), 零次或多次, 在它可以放弃之前。可能性不是无限的,但也可能是无限的。
您可能想到了 [\s\S]*
,这是一个众所周知的习惯用法,用于匹配任何字符包括换行符。它在 JavaScript 中使用,它没有办法使点 (.
) 匹配行分隔符。大多数其他风格允许您指定一个匹配模式来改变点的行为;有些人称之为 DOTALL 模式,但 .NET 使用更常见的 Singleline。
string sPattern = @"^Line.*tst0063$";
RegexOptions options = RegexOptions.IgnoreCase | RegexOptions.Singleline;
您还可以使用内联修饰符:
string sPattern = @"(?is)^Line.*tst0063$";
更新:是的,作为对您评论的回应,正则表达式引擎无法判断任何匹配项必须以tst0063< 结尾,这似乎确实很奇怪
。但它并不总是那么容易分辨。寻找这样的捷径需要付出多少努力?在所有 匹配(成功和失败)变得太慢之前,您可以在正常匹配算法上使用多少条捷径?
.NET 拥有目前最好的正则表达式实现之一:快速、强大,并且具有一些真正令人惊叹的特性。但是您必须考虑要告诉它做什么。例如,如果您知道必须至少有一个,请使用 +
,而不是 *
。如果您遵循该规则,就不会遇到这个问题。这个正则表达式:
@"^Line(\s+\S+)*tst0063$"
...工作得很好。 (\s+\S+)*
是一种非常合理的匹配零个或多个单词的方法,其中单词被定义为一个或多个非空白字符,由一个或多个空白字符与其他单词分隔开。 (这就是你想要做的吗?)
关于c# - RegularExpressions.Regex.IsMatch 挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20778554/
我正在使用 lodash用于比较以下两个对象: obj1 = { "_id": "57767", "Re": { "PropertyTypes": [
我为缓存扩展编写了测试。我想按模式从缓存中删除。 a) 在这个例子中测试失败 [Test] public void Should_found_by_pattern() {
我知道有很多类似的问题,但这是特定于我的正则表达式的。我正在尝试查看字符串中是否有任何 html。 Regex tagRegex = new Regex(@"]+)[^>]*>.*?") if(tag
我正在尝试查找遵循“char 'h' 后跟一位或多位数字”模式的文件,例如 h0、h1、h22 但我也得到“h22 cco”和 hhh0 如何解决这个问题 files = new List((from
我正在对一些转义字符串进行匹配比较: Regex.IsMatch("\\Application.evtx", "DebugLogs\\ConfigurationServices.log"); 我不明白
我一直在努力解决一个奇怪的问题。我有一组正则表达式模式,用于匹配和阻止针对我网站的黑客攻击。 有一种特定的模式非常常见,但是由于某种原因,我针对它的模式并不总是与传入的 url 匹配。 如果我手动单步
我有一个列表,例如: Type [data] Device Type [data] Pin type [data] 我试图只搜索类型 [data] 而不是设备类型或 Pin 类型。请注意 [data]
我尝试使用正则表达式来检查字符串是否仅包含:0-9、A-Z、a-z、\、/或 -。我使用了 Regex validator = new Regex(@"[0-9a-zA-Z\-/]*"); 无论我引入
我有一个小函数,用于在用户取消编辑后验证 StringGrid 中的列。 void validateColumn(int column, const UnicodeString regexp, TSt
谁能告诉我以下提到的正则表达式中的错误: 正则表达式:@"^(tcm:\d+-\d+)" 输入字符串:tcm:12-123a6 问题:据我所知,\d 应该只匹配数字。输入字符串中有'a'。它仍然匹配输
我有以下代码可以正常工作,但我需要用变量替换站点地址... string url = HttpContext.Current.Request.Url.AbsoluteUri; // Get the
我有以下代码, filter="search.ismatch('Paris\-l''Hopital*', 'DestinationAddress/City', 'full', 'all')" 此过滤器
我期待下面的代码返回 Chris Davis 和 Mike Trout。它只返回 Mike Trout。是否无法匹配多个值?请记住,我最终需要匹配 30 多个值。我也尝试过使用indexOf,但它的扩
这个问题已经有答案了: Regex doesn't work in String.matches() (9 个回答) 已关闭 5 年前。 原始正则表达式:[v]\d+?\.\d 捕获字符串中的“v{N
我有一个很长的文本 (50-60 KB),我需要针对它运行几个正则表达式(总共大约 100 个规则)。然而,这太慢了,以至于它基本上不起作用。 我所做的只是围绕规则创建了一个循环,其中每个规则执行 R
这是我的代码的摘录: string[] myStr = { " Line1: active 56:09 - tst0063, tst0063",
我正在使用 new Regex("(?m)^\S+ [A-Z]{1,3}$").IsMatch(sStringToCheck) 检查多行字符串。 我的问题是,它似乎只验证字符串的最后一行。 此列表通过
是的,这是另一个 .net 正则表达式问题:)(请原谅导致实际问题的长篇华夫饼) 我允许用户使用简单的日期/时间宏来快速输入日期(他们不需要日期选择器) 例如他们可以输入: d +1d -2h 这将为
我编译的代码: namespace TestRegExp { class Program { static void Main(string[] args)
我正在尝试使用以下正则表达式匹配可以包含任意数量的数字字符或小数点的字符串: ([0-9.])* 下面是一些用于测试正则表达式的 C# 代码: Regex regex = new Regex("([0
我是一名优秀的程序员,十分优秀!