【问题标题】:C# Regex filter problemsC# 正则表达式过滤器问题
【发布时间】:2020-11-13 02:36:49
【问题描述】:

此时,我在早些时候发布了一些关于 Regex 的相同类型问题。它让我很头疼,我查阅了大量关于如何使用正则表达式的文档,但我仍然无法理解它。我不想再浪费 6 个小时来过滤简单(我认为)的表达式。

所以基本上我想要做的是过滤所有带有 HTML 扩展名结尾的文件类型('*' 星来自 Winforms Tabcontrol,表示文件已被修改。我还需要它们在IgnoreCase

.html, .htm, .shtml, .shtm, .xhtml
.html*, .htm*, .shtml*, .shtm*, .xhtml*

同时过滤一些 CSS 文件:

.css
.css*

还有一些 SQL 文件:

.sql, .ddl, .dml
.sql*, .ddl*, .dml*

我之前的问题得到了过滤Python文件的答案:

.py, .py, .pyi, .pyx, .pyw
Expression would be: \.py[3ixw]?\*?$

但是当我试图从上面的表达式中学习时,我总是会只打开一个.xhtml,其余的都是无效的。

对于 HTML 表达式,我目前有这个:\.html|.html|.shtml|.shtm|.xhtml\*?$RegexOptions.IgnoreCase。但输出将只允许.xhtml 区分大小写或不区分大小写。 .html 文件、.htm 和其他文件不匹配。我非常感谢您对您提供的每个表达方式的解释(所以我不必再问同样的问题了)。

谢谢。

【问题讨论】:

  • * 在通配符中代表任何 0 个或多个字符。您可能想要(?i)\.[xs]?htm\w*$(?i)\.css\w*$(?i)\.py\w*$ / (?i)\.py[3ixw]?$。请注意,您仍然没有逃脱所有.s。
  • @WiktorStribiżew 所以我上面的表达式\.html|.html|.shtml|.shtm|.xhtml\*?$ 不起作用,因为除了.xhtml 之外的所有东西都将. 转义了?
  • 你的问题不太清楚。见what your regex matches
  • @WiktorStribiżew 感谢您提供。实际上最后一个问题,我在这里用我上面提到的SQL files 的过滤器进行猜测。我试过这个表达式:\.[a-zA-Z]+$。这会是正确的实施方式吗?还是有其他有效的方法?再次感谢。
  • SQLite3 文件可以有.sq3 扩展名,那么,你需要在正则表达式中添加数字,\.[a-zA-Z0-9]+$

标签: c# .net regex winforms


【解决方案1】:

对于这种情况,您可以从一个简单的正则表达式开始,逐步简化为一个好的正则表达式:

在 C# 中,使用 IgnoreCase 基本上是

Regex myRegex = new Regex("PATTERN", RegexOptions.IgnoreCase);

现在的模式:最简单的模式是简单地将所有有效结果与 OR + 转义(如果可能的话)连接起来:

\.html|\.htm|\.shtml|\.shtm|\.xhtml|\.html*|\.htm*|\.shtml*|\.shtm*|\.xhtml*

.html* 是指.html + 任何东西,在正则表达式中写为.*(任何字符,0-无限次)。

\.html|\.htm|\.shtml|\.shtm|\.xhtml|\.html.*|\.htm.*|\.shtml.*|\.shtm.*|\.xhtml.*

然后,您可以将所有重复的模式组合在一起。所有文件结尾都以点开头,可能有一个可选结尾,ending.* 始终包含ending

\.(html|htm|shtml|shtm|xhtml).*

然后,我经常看到htm,所以我尝试提取它。将htm 前后所有可能的字符放在一起(? 表示出现 0 或 1 次):

\.(s|x)?(htm)l?.*

而且,我总是检查它是否仍在 regexstorm for .Net 中工作

这样,你也可以得到另外两个的正则表达式,最后将它们连接在一起。

【讨论】:

  • 好吧,我现在可以看到很多方法来实现这一点。例如,带有 .html 文件的过滤器可以像 Wiktor 所说的那样完成:(?i)\.[xs]?htm\w*$。但我想要它在RegexOptions.IgnoreCase。这是让它不区分大小写的最佳方法吗?另外,我发现.shtm.shtml 不匹配。
  • @Kirtstarweb 在其他语言中,您可以在末尾使用 /gmi 设置这些 标志(全局、多行、不区分大小写),在 .net 中您可以这样设置。我猜(?i) 也应该在 .net 中工作。而[xs](字符类)与(x|s)基本相同。 Wiktor 还用 \w 替换了您的 .*(any char),它只计算单词 chars(abc...),因此没有空格、换行符或数字。这些是细化表达式的进一步步骤。
  • 我想我现在看到了,我会考虑选择最适合它的表达方式。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-28
  • 2013-09-23
相关资源
最近更新 更多