【问题标题】:Regex - Extract a substring from a given string正则表达式 - 从给定字符串中提取子字符串
【发布时间】:2012-09-20 06:52:29
【问题描述】:

我这里有一个字符串,This is a string: AAA123456789

所以这里的想法是使用正则表达式提取字符串AAA123456789

我正在将它与 X-Path 结合起来。

注意:如果有这个帖子,请引导我。

我认为,按道理,我应该substring(myNode, [^AAA\d+{9}])

我不太确定正则表达式部分。

这个想法是在遇到“AAA”并且只有数字但只有9个后续数字时提取字符串。

【问题讨论】:

  • 你试过什么?您必须至少有一个您尝试过但不起作用的正则表达式(除非您只是希望我们为您完成您的工作......)
  • 字符串总是有相同的格式吗?你总是有九位数吗?因为如果是这样,您不需要正则表达式,只需简单的子字符串处理。
  • 差不多,用\d{9}就行了(+{9}都是重复操作符)。
  • 您使用的是 XPath 2 对吗?不是 XPath 1。
  • 字符串并不总是相同的格式。看,它可以是“这是一个字符串:AAA123456789 但不是双精度”。所以我不能真正使用常见的xpath。所以这里的完全证明解决方案是对字符串 AAA123456789 进行子串化。好吧,我已经尝试过上面显示的那个。也许是错的。另一种方法就像 Jere 提到的,常见但不是完全证明的方法。子字符串后(大写(myNode),“字符串”)。再说一次,这不合适。谢谢

标签: regex xpath substring


【解决方案1】:

纯 XPath 解决方案

substring-after('This is a string: AAA123456789', ': ')

产生

AAA123456789

XPath 2.0 解决方案

tokenize('This is a string: AAA123456789 but not an double',
              ' '
              )[starts-with(., 'AAA')]

或:

tokenize('This is a string: AAA123456789 but not an double',
              ' '
              )[matches(., 'AAA\d+')]

或:

replace('This is a string: AAA123456789 but not an double',
              '^.*(A+\d+).*$',
              '$1'
              )

【讨论】:

  • 嗨,Dimitre,您能解释一下更换部件吗?这就是我所理解的,我认为,用 $1 替换除 *(A+\d+).*$ 之外的所有内容......这是正确的......但是 $1 做了什么......
  • @Vincent,这意味着:将整个字符串(如果它包含 A+\d+ 形式的子字符串)仅替换为(第一对)括号内的子表达式。 replace 的第三个参数必须包含一个字符串,指定用什么替换每个目标。它允许按数字(位置)“捕获引用”。在此处阅读有关replace() 的更多信息:w3.org/TR/xpath-functions/#func-replace
  • 先生,是否有一个 XPath 问题您没有回答,或者不知道答案? :-)
  • @AlptiginJalayr,可以立即看出我没有尝试在 SO 上回答所有 XPath 问题。 :)
  • 结合tokenizematches 的可能性对我来说是新的。对我有帮助,非常感谢。
【解决方案2】:

好的,在这里参考了很棒的人的答案和 cmets 后,我用我选择的这个解决方案总结了我的发现。来了,

concat("AAA", substring(substring-after(., "AAA"), 1, 9))

所以我首先,在以“AAA”作为第一个参数的字符串之后,长度为 1 到 9...任何更多的子字符串被忽略。然后由于我使用 AAA 作为参考,因此不会出现,因此将 AAA 连接到值的前面。所以这意味着我将得到 AAA 之后的第一个 9 位,然后在前面连接 AAA,因为它是静态数据。

无论有什么其他贡献,这将允许数据正确。

但我喜欢@Dimitre 的正则表达式。替换部分。如果没有空格作为参数,则标记化不是这样。用正则表达式替换,这也很棒。谢谢。

还要感谢你们...

【讨论】:

    【解决方案3】:

    首先,我很确定您不是想拥有[^ ... ]。这定义了一个“负字符类”,你当前的正则表达式说,“给我一个单个字符,它是不是以下之一: A0123456789{}"。很明显,您的意思可能是"AAA(\d{9})"。现在,根据this handy website,XPath 确实支持捕获组以及反向引用,所以请选择:

    "AAA(\d{9})"
    

    并提取$1,第一个捕获组,或者:

    "(?<=AAA)\d{9}"
    

    并参加整场比赛 ($0)。

    【讨论】:

      【解决方案4】:

      你可以试试这个吗:

      A{3}(\d{9})

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-10
        • 2014-08-25
        • 2010-10-14
        • 2020-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多