Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >匹配控制字符之前出现的字符,如果不存在控制字符,则匹配零。

匹配控制字符之前出现的字符,如果不存在控制字符,则匹配零。
EN

Stack Overflow用户
提问于 2013-04-19 16:25:14
回答 3查看 174关注 0票数 4

我正在开发功能,允许用户为文件夹层次结构中的项指定一个“通配符”路径,并在项目匹配该路径时执行相关操作。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    Path         Action
    -----------  -------
 1. $/foo/*/baz  include
 2. $/foo/bar/*  exclude

现在,使用上面的示例,$/foo/bar/baz上的一个项将匹配这两个操作。考虑到这一点,我想提供通配符路径的粗分数,这将基于第一个通配符出现的“深度”。最深邃的道路将获胜。重要的是,只有以正斜杠(/*/)为界的*才允许作为通配符(除了在结束时为/*),并且可以在路径的各个点指定任何数字。

TL;DR;

因此,我认为在第一个*之前用正则表达式来计算斜杠的数量是可行的。但是,由于许多原因,在路径中没有通配符的情况下,正斜杠的匹配将为零。我有以下负面的展望:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 (?<!\*.*)/

当有通配符(例如,上面路径#1的两个正斜杠匹配和#2的3个正斜杠匹配)时,它工作得很好,但是当没有通配符时,它自然会匹配所有正斜杠。我相信这是一个简单的步骤,没有匹配,但由于生锈的调整技能,我是卡住了。

理想情况下,从学术的角度来看,我想看看一个正则表达式是否可以捕捉到这一点,但是为更优雅的解决问题提供了额外的积分!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-19 22:45:31

这将是一种方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
match = Regex.Match(subject, 
    @"^       # Start of string
    (         # Match and capture in group number 1...
     [^*/]*   #  any number of characters except slashes or asterisks
     /        #  followed by a slash
    )*        # zero or more times.
    [^*/]*    # Match any additional non-slash/non-asterisk characters.
    \*        # Then match an asterisk", 
    RegexOptions.IgnorePatternWhitespace);

如果subject字符串中没有星号(0分数),则此正则表达式无法匹配。如果正则表达式匹配,则可以确保其中至少有一个星号。

现在聪明的是,与大多数其他正则表达式不同,.NET正则表达式实际上可以计算重复捕获组匹配的次数(大多数其他regex引擎只是丢弃该信息),这允许我们在字符串中的第一个星号之前确定斜杠的数量。

这些信息可以在

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
match.Groups[1].Captures.Count

(当然,这意味着“在第一个星号之前没有斜杠”和“根本没有星号”都会得到分数0,这似乎是您在问题中要求的,但我不知道为什么这会有意义)

票数 2
EN

Stack Overflow用户

发布于 2013-04-19 17:22:21

一种能够完成这项任务的方法:

  1. 验证所有测试路径(确保它们有效,并包含\*\或end by *)。
  2. 使用排序集合跟踪测试路径和相关操作。
  3. 根据通配符在字符串中的位置对集合进行排序。
  4. 根据排序集合中的每个路径测试项。 可以将字符串中的*替换为.*?,以便在正则表达式中使用它。
  5. 在第一个匹配处停止并返回关联的操作,否则将继续进行集合中的下一个测试。

对上述一些内容的快速测试实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void Main()
{
    // Define some actions to test and add them to a collection
    var ActionPaths = new List<ActionPath>() {
        new ActionPath() {TestPath = "/foo/*/baz",   Action = "include"},
        new ActionPath() {TestPath = "/foo/bar/*",   Action = "exclude"},
        new ActionPath() {TestPath = "/foo/doo/boo", Action = "exclude"},
    };
    // Sort the list of actions based on the depth of the wildcard
    ActionPaths.Sort();

    // the path for which we are trying to find the corresponding action
    string PathToTest = "/foo/bar/baz";

    // Test all ActionPaths from the top down until we find something
    var found = default(ActionPath);
    foreach (var ap in ActionPaths) {
        if (ap.IsMatching(PathToTest)) {
            found = ap;
            break;
        }
    }

    // At this point, we have either found an Action, or nothing at all
    if (found != default(ActionTest)) {
        // Found an Action!
    } else {
        // Found nothing at all :-(
    }
}

// Hold and Action Test
class ActionPath : IComparable<ActionPath>
{
    public string TestPath;
    public string Action;

    // Returns true if the given path matches the TestPath
    public bool IsMatching(string path) {
        var t = TestPath.Replace("*",".*?");
        return Regex.IsMatch(path, "^" + t + "$");
    }

    // Implements IComparable<T>
    public int CompareTo(ActionPath other) {
       if (other.TestPath == null) return 1;
       var ia = TestPath.IndexOf("*");
       var ib = other.TestPath.IndexOf("*");
       if (ia < ib) return 1;       
       if (ia > ib) return -1;
       return 0;
   }
}
票数 1
EN

Stack Overflow用户

发布于 2013-04-19 19:58:56

这里不需要正则表达式。

对于LINQ,它是一条2线线:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
string s = "$/foo/bar/baz";
var asteriskPos = s.IndexOf('*');  // will be -1 if there is no asterisk
var slashCount = s.Where((c, i) => c == '/' && i < asteriskPos).Count();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16115261

复制
相关文章
ASCII控制字符
国际标准ISO/IEC 646 二进制 十进制 十六进制 缩写 可以显示的表示法 名称/意义 0000 0000 0 00 NUL ␀ 空字符(Null) 0000 0001 1 01 SOH ␁ 标题开始 0000 0010 2 02 STX ␂ 本文开始 0000 0011 3 03 ETX ␃ 本文结束 0000 0100 4 04 EOT ␄ 传输结束 0000 0101 5 05 ENQ ␅ 请求 0000 0110 6 06 ACK ␆ 确认回应 0000 0111 7 07 BEL ␇ 响铃
红目香薰
2022/11/29
5490
tmux终端意外出现控制字符
接触tmux后,发现它也够简单,而且相比screen比较实用的一点是,在screen里,无法按下ctrl+a组合键回到当前命令行的行首,而tmux则可以,于是就可耻的”叛变了“。
老叶茶馆
2020/10/10
1.3K0
PHP 中如何移除控制字符
控制字符(Control Character),或者说非打印字符,出现于特定的信息文本中,表示某一控制功能的字符,如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(振铃)等;通讯专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等。
Denis
2023/04/15
5550
打印罗马字符_ascii非打印控制字符
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M,其对应关系如下表:
全栈程序员站长
2022/11/19
7500
打印罗马字符_ascii非打印控制字符
字符串的匹配算法_多字符串匹配
不要被事物的表面现象所迷惑,这个算法全称:Brute Force,有个拉风的中文名:暴力匹配算法。
全栈程序员站长
2022/09/25
2.2K0
字符串的匹配算法_多字符串匹配
[算法系列之十二]字符串匹配之蛮力匹配
字符串匹配是数据库开发和文字处理软件的关键。幸运的是所有现代编程语言和字符串库函数,帮助我们的日常工作。不过理解他们的原理还是比较重要的。
全栈程序员站长
2022/09/24
1.7K0
[算法系列之十二]字符串匹配之蛮力匹配
字符串匹配算法_多字符串匹配
从好后缀的后缀子串中,找一个最长的且和模式串的前缀子串匹配的 {v},滑动至 {v} 对齐
全栈程序员站长
2022/09/25
1.8K0
字符串匹配算法_多字符串匹配
字符串匹配算法 -- 朴素匹配
为什么叫做朴素匹配,我理解的就是这是一种寻常想法,简单粗暴的算法。是一种暴力的算法,不考虑其时间复杂度以及效率。只要达到匹配的目的即可。
lexingsen
2022/02/24
1.9K0
字符串匹配算法 -- 朴素匹配
Java字符串匹配_正则匹配替换字符串
public static void main(String args[]) {
全栈程序员站长
2022/09/24
2.6K0
正则表达式之匹配不存在特定字符的字符串
作为一名不经常使用正则表达式的程序员,想用最简单的语言来描述否定匹配,不过发现确实不是那么好理解。还是按照自己知道的来描述吧。
李小白是一只喵
2020/04/24
5.7K0
正则表达式之匹配不存在特定字符的字符串
mysql技巧:如果记录存在则更新/如果不存在则插入的三种处理方法
新增一个员工时,如果该员工已存在(以员工号f_emp_code作为判断依据),则更新,否则插入。而且工资f_salary,更新时,不得低于原工资(即:工资只能涨,不能降)。
菩提树下的杨过
2018/12/21
9.3K0
字符串匹配
问题描述 试题编号: 201409-3 试题名称: 字符串匹配 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述   给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行。你的程序还需支持大小写敏感选项:当选项打开时,表示同一个字母的大写和小写看作不同的字符;当选项关闭时,表示同一个字母的大写和小写看作相同的字符。 输入格式   输入的第一行包含一个字符串S,由大小写英文字母组成。   第二行包含一个数字,表示大小写敏感的选项,当数字为0时表示大小写不敏感,当数字为1时表示大小写敏感。   第三行包含一个整数n,表示给出的文字的行数。   接下来n行,每行包含一个字符串,字符串由大小写英文字母组成,不含空格和其他字符。 输出格式   输出多行,每行包含一个字符串,按出现的顺序依次给出那些包含了字符串S的行。 样例输入 Hello 1 5 HelloWorld HiHiHelloHiHi GrepIsAGreatTool HELLO HELLOisNOTHello 样例输出 HelloWorld HiHiHelloHiHi HELLOisNOTHello 样例说明   在上面的样例中,第四个字符串虽然也是Hello,但是大小写不正确。如果将输入的第二行改为0,则第四个字符串应该输出。 评测用例规模与约定   1<=n<=100,每个字符串的长度不超过100。
geekfly
2022/05/06
8260
字符串匹配算法_字符串模式匹配算法
网络信息中充满大量的字符串,对信息的搜寻至关重要,因此子字符串查找(即字符串匹配)是使用频率非常高的操作:给定一段长度为N的文本和长度为M的模式字符串(N≥M),在文本中找到一个和模式串相匹配的子串。由这个问题可以延伸至统计模式串在文本中出现的次数、找出上下文(和该模式串相符的子字符串周围的文字)等更复杂的问题。
全栈程序员站长
2022/08/02
2.9K0
字符串匹配算法_字符串模式匹配算法
字符串匹配---BF算法--朴素的模式匹配算法
#include<iostream> using namespace std; #include<string> //BF int BF(string& a,string& b) { //求出a串的长度 int sizeA=a.length();//返回的是字符串中字符个数 //求出b串的长度 int sizeB = b.length(); //i指向A,j指向B子串 int i=0; int j=0; //b是子串,a while (i <=sizeA-1&&j<= sizeB-1)
大忽悠爱学习
2021/03/15
2.1K0
字符串 模式匹配
本文介绍了什么是程序员的内功——算法以及其重要性。算法是程序的核心,它能够高效地解决问题。文章通过一些例子详细讲解了算法的概念和其具体实现,并探讨了算法对于程序员的职业发展以及日常生活中的影响。
静默虚空
2018/01/05
1.5K0
字符串 模式匹配
字符串匹配(一) -- 朴素匹配与 KMP 算法
软件算法中,最基础的算法要数排序和查找了,而字符串模式匹配算法可谓是基础中的基础,而最有名又最具代表性的字符串匹配算法要数 KMP 算法了,本文我们就来详细介绍一下 KMP 算法
用户3147702
2022/06/27
1.3K0
字符串匹配(一) -- 朴素匹配与 KMP 算法
字符串匹配(多模式匹配篇)「建议收藏」
又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。
全栈程序员站长
2022/09/24
2K0
字符串匹配(多模式匹配篇)「建议收藏」
bash字符串匹配
#!/bin/sh foo() {     local basedir=$1     local all_entries=`ls -c`     for entry in $all_entries     do           if test -d $entry; then             cd $entry&&foo ${basedir}/$entry;cd - >/dev/null         else             if [[ $entry
一见
2018/08/07
1K0
字符串匹配问题
、字符串匹配问题 【问题描述】        字符串中只含有括号 (),[],<>,{},判断输入的字符串中括号是否匹配。如果括号有互相包含的形式,从内到外必须是<>,(),[],{},例如。输入: [()] 输出:YES,而输入([]), ([])都应该输出NO。 【输入格式】strs.in        文件的第一行为一个整数n,表示以下有多少个由括好组成的字符串。接下来的n行,每行都是一个由括号组成的长度不超过255的字符串。 【输出格式】strs.out        在输出文件中有N行,每行都是
attack
2018/04/12
1.5K0
【CCF】字符串匹配
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
喜欢ctrl的cxk
2019/11/08
9930

相似问题

PHP匹配控制字符但不匹配空格?

23

如何防止[a]类型regex匹配控制字符

14

包含特殊ANSI ESC控制字符的Regex匹配

22

scala-在奇数位置匹配控制字符

119

regsub匹配为lindex索引,对照irc控制字符

16
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文