8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

在 Perl 中解析 C 字符串时 `s/'((?:[^']|\')*)'//` 有什么问题?

Farbod Ahmadian 2月前

87 0

我似乎无所事事,因为我无法找出正则表达式的错误所在:我试图解析一个包含一行字符串的 C 源文件(实际上这些字符串是

我似乎坐在我的眼睛上,因为我无法找出我的正则表达式有什么问题:

我正在尝试解析包含一行内的字符串的 C 源文件(实际上这些字符串是正则表达式,但这并不重要)。基本上 /"([^"]*)"/ 应该捕获字符串(不带引号),除非其中有双引号。

我也可以使用字符串中的双引号匹配 /(\\"*)/! ,但是我无法组合两个正则表达式:

使用 /"((?:[^"]|\\")*)"/ (捕获双引号之间的文本直到第一个非转义的双引号)捕获在第一个之后结束 " ,如本示例调试器会话所示:

  DB<15> $x='"SAMSUNG SSD SM841N? (2\\.5\"? 7mm |mSATA )?(128|256|512)GB( SED)?|"'

  DB<16> x $x =~ s/"((?:[^"]|\\")*)"//
0  1
  DB<17> x $x
0  '? 7mm |mSATA )?(128|256|512)GB( SED)?|"'
  DB<18>

在写这个问题的时候,我尝试交换两个替代方案,突然它就起作用了:

  DB<18> $x='"SAMSUNG SSD SM841N? (2\\.5\"? 7mm |mSATA )?(128|256|512)GB( SED)?|"'

  DB<19> x $x =~ s/"((?:\\"|[^"])*)"//
0  1
  DB<20> x $x
0  ''
  DB<21>

那么正则表达式 A|B B|A 等价的吗?

帖子版权声明 1、本帖标题:在 Perl 中解析 C 字符串时 `s/'((?:[^']|\')*)'//` 有什么问题?
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Farbod Ahmadian在本站《string》版块原创发布, 转载请注明出处!
最新回复 (0)
  • SsD 2月前 0 只看Ta
    引用 2

    我对“坐在眼睛上”这个表达并不熟悉。摆出这个姿势会是一个挑战,即使对于柔术演员来说也是如此。

  • 通常的说法是“我的眼睛上沾上了西红柿”,但即便如此,人们还是会怀疑它们是否足够粘;-)

  • 有什么问题 s/"((?:[^"]|\\")*)"//

    问题是,这 [^"] 可以匹配逃跑的开始。

    正如您所猜测的,您可以通过改变替代项的顺序来解决这个问题,因为 Perl 的正则表达式引擎会按顺序尝试替代项。

    "((?:\\"|[^"])*)"
    

    但这并不可靠。正如你的直觉告诉你的那样,编写模式时顺序无关紧要,这样更可靠。

    您的解决方案缺乏稳健性,这意味着 "((?:\\"|[^"])*)" 输入不是有效字符串文字时,它会将其视为 "abc\" 有效字符串文字。换句话说,您的解决方案假定输入是有效的,而更稳健的解决方案则不会。

    以下是一个强大的解决方案:

    "((?:[^"\\\n]|\\.)*)"
    

    优化:

    "((?:[^"\\\n]++|\\.)*+)"
    

    因为在这种情况下编写一个强大的解决方案同样容易,所以这样会更好。

  • Yura 2月前 0 只看Ta
    引用 5

    我还尝试使用非贪婪捕获,这样第一个非转义的 \' 将终止捕获(避免 [^\'])。我尝试了后视断言(这样 \' 前面可能不会有 \ ,但在我尝试的几次尝试中都无法让它工作……

  • 回复“我也尝试使用非贪婪捕获”,它没有像你想要的那样匹配,所以你尝试让它匹配得更少???

  • 关于“我使用后视断言(因此 \' 前面不能是 \ ,\',但 \' 前面可以有 \ 。考虑 \'\\\'

  • 当我在写问题时找到了答案时,我本可以取消提问,但由于我认为这也可能引起其他人的兴趣,所以我将在这里提供我的答案:

    来自 man perlre(1):

    备选方案从左到右进行尝试,因此第一个找到的整个表达式匹配的备选方案就是被选中的备选方案。这意味着备选方案不一定是贪婪的。例如:当将 \'foo|foot\' 与 \'barefoot\' 进行匹配时,只有 \'foo\' 部分会匹配,因为这是第一个尝试的备选方案,并且它成功匹配目标字符串。(这似乎并不重要,但当您使用括号捕获匹配的文本时,这很重要。)

    所以实际上是的,替代方案的顺序很重要。

  • 因此,当记录具有相同的 VAR、相同的 Group 但不同的 SalesPrice 时:我需要将其注释为“需要定义”,我试图使用窗口函数但无法成功。如能得到任何帮助我将不胜感激...

    this is a sample database

    因此,当记录具有相同的 VAR、相同的 Group 但不同的 SalesPrice 时:我需要将其注释为“需要定义”,我试图使用窗口函数,但无法成功。任何帮助都值得赞赏,提前致谢

    我尝试使用窗口函数并添加额外的列,但没有产生任何有效的结果。

  • 引用 10

    正如@siggemannen在评论中所建议的,您可以使用 MIN() MAX() 窗口函数。如果组中的最小值与最大值不同,则标记它:

    SELECT *, CASE WHEN MAX(salesprice) OVER (PARTITION BY Var, [Group]) <> MIN(salesprice) OVER (PARTITION BY Var, [Group])
                   THEN 'need to define' ELSE '' 
              END AS Comment
    FROM mytable
    ORDER BY ID
    

    如果您使用的是 SQL SERVER 2022+,则使用该 WINDOW 子句定义一次窗口并在查询中多次引用它:

    SELECT *, CASE WHEN max(salesprice) OVER win <> MIN(salesprice) OVER win
                   THEN 'need to define' ELSE '' 
              END 
    FROM mytable
    WINDOW win AS (PARTITION BY Var, [Group])
    ORDER BY ID
    
  • 小澄清 - 使用窗口子句语法本身并不能保证将使用相同的数据传递。它基于 over 子句本身。此答案中的顶部语法检查也将生成具有相同属性的计划。显然,使用窗口子句可以帮助避免拼写错误并简化阅读 SQL 文本以使其更易于维护,但您可以将窗口子句视为宏扩展到查询计划中,就像您输入了上面的完整版本一样。

  • 我正在尝试创建一个通过流元素广播的警报。我希望用户的动态文本能够适应绘制曲线的路径。所述文本,我希望它具有摆动动画。如果...

    我正在尝试创建一个通过流元素进行广播的警报。

    我希望用户的动态文本能够适应绘制曲线的路径。所述文本,我希望它具有摆动动画。如果文本正常绘制,动画效果完美。另一方面,当经过路径时,它不会播放,或者播放时就像是整个文本块而不是单独的字母。

    HTML

    <div class="text-container">
        <div class="awsome-text-container">
            <svg width="100%" height="100%" viewBox="0 0 200 400" preserveAspectRatio="xMidYMid meet">
                <path id="curve" d="M -35,50 L-35,325 Q-35,375 65,375 L175,375" fill="transparent" stroke="black" stroke-width="2"/>
                <text font-size="85px">
                    <textPath id="username-container" href="#curve"></textPath>
                </text>
            </svg>
        </div>
        <p>{{message}}</p>
    </div>
    
    

    CSS

    @import url('https://fonts.googleapis.com/css?family=Caprasimo');
    
    * {
        font-family: 'Caprasimo', sans-serif;
        margin: 0;
        padding: 0;
        box-sizing: border-box;
    }
    
    .awsome-text-container {
        position: absolute;
        bottom: 0;
        left: 50%;
        transform: translateX(-50%);
        z-index: 999;
        width: 100%;
        height: 400px;
        text-align: center;
        display: flex;
        justify-content: center;
        align-items: center;
        overflow: visible;
    }
    
    .animated-letter {
        animation-duration: 1.5s;
        animation-iteration-count: infinite;
        animation-timing-function: ease-in-out;
        opacity: 1;
        display: inline-block;
    }
    
    .text-container {
        font-size: 16px;
        color: black;
        text-align: center;
        margin: auto;
    }
    
    @keyframes wobble {
        0% {
            transform: translateX(0) rotate(0deg);
        }
        15% {
            transform: translateX(-2px) rotate(-2deg);
        }
        30% {
            transform: translateX(2px) rotate(2deg);
        }
        45% {
            transform: translateX(-1.5px) rotate(-1.5deg);
        }
        60% {
            transform: translateX(1.5px) rotate(1.5deg);
        }
        75% {
            transform: translateX(-1px) rotate(-1deg);
        }
        90% {
            transform: translateX(1px) rotate(1deg);
        }
        100% {
            transform: translateX(0) rotate(0deg);
        }
    }
    
    

    JS

    function stringToAnimatedHTML(s, anim) {
        const stringAsArray = s.split('');
        const animationDuration = '1.5s';
    
        const animatedLetters = stringAsArray.map((letter, index) => {
            const randomDelay = Math.random() * 1;
            const transformValues = `translateX(${Math.random() * 2 - 1}px)`;
            return `<tspan class="animated-letter ${anim}" style="animation-duration: ${animationDuration}; animation-delay: ${randomDelay}s; transform: ${transformValues};">${letter}</tspan>`;
        });
    
        return animatedLetters.join('');
    }
    
    const name = '{{name}}';
    const animation = 'wobble';
    const userNameContainer = document.querySelector('#username-container');
    userNameContainer.innerHTML = stringToAnimatedHTML(name, animation);
    
    
  • 我正在开发一款 Flutter 桌面应用程序(以后可能会支持移动应用程序),它允许用户登录他们的 MS 帐户,以便我可以检索个人资料信息。目前我打开 MS 登录 U...

    我正在开发一款 Flutter 桌面应用程序(以后可能会支持移动应用程序),它允许用户登录他们的 MS 帐户,以便我可以检索个人资料信息。

    目前,我在默认 Web 浏览器中打开 MS 登录 URL。通过重定向到我的 Web 服务器获取访问令牌后,我想通过深度链接(自定义 URL 方案)将该访问令牌传回我的 Flutter 应用程序。我面临的问题是,访问令牌长度超过 2000 个字符,但某些 Web 浏览器仅支持约 2000 个字符。

    我该如何解决这个问题?

    如果可能的话,我想避免使用 ms graph 包,因为我想支持不同的平台(例如 Slack),并且使用上层方法适用于所有平台。

返回
作者最近主题: