【问题标题】:Match first only instance of a character [duplicate]仅匹配字符的第一个实例[重复]
【发布时间】:2019-08-20 11:07:58
【问题描述】:

我正在尝试sdtmig-3-1-2 等字符串中字符的第一个实例与XPath::replace 匹配,并将其替换为/,以便生成的字符串为@987654328 @。我不能保证关于该模式的其他任何事情,除了它会有一个或多个破折号。我很难找到始终只匹配- 的特定第一个实例的正则表达式模式。

我觉得我接近了:

(?:.+?)(-)(?:.+)

但这也匹配了完整的字符串,所以不好。

请不要提供任何解决方案,除了可以在https://regex101.com 上使用的普通正则表达式。 正则表达式的“风格”应遵守 XPath/XQuery 语义 (https://www.w3.org/TR/xmlschema-2/#regexs)。我无法控制正则表达式搜索中的全局标志。

【问题讨论】:

  • 什么编程语言?
  • 你为什么想要一个正则表达式?
  • 仅限正则表达式。请不要使用任何可用于regex101.com 的普通正则表达式来提供解决方案。正则表达式的“风味”应遵守 XPath/XQuery 语义 (w3.org/TR/xmlschema-2/#regexs)。
  • 我想要正则表达式,因为我必须使用正则表达式。我不能为此使用任何其他语言。
  • 在充分尊重 Wiktor 的情况下,这不是与之前提出的问题的重复。该问题是特定于 Notepad++ 的,它具有与 XPath 匹配/替换不同的限制和语义。

标签: regex xpath


【解决方案1】:

不引入g (global flag),正则表达式最多匹配一次。这相当于普通的replace 调用,如'sdtmig-3-1-2'.replace('-', '/'),结果为"sdtmig/3-1-2"

请查看plain regular expression usage (make sure the global modifier is turned off and use /-/ regular expression with a substitution of /)

例如:

console.log('sdtmig-3-1-2'.replace(/-/, '/'));

使用全局标志,它将替换所有出现:

console.log('sdtmig-3-1-2'.replace(/-/g, '/'));

您还可以在第一次出现之前对任何内容使用惰性前缀匹配,并将匹配的组替换为其原始内容,以便它们环绕被替换的字符。请查看正则表达式:
(.*?)-(.*) and a substitution of $1/$2。 这应该适用于XQuery replace function

console.log('sdtmig-3-1-2'.replace(/(.*?)-(.*)/, '$1/$2'));

【讨论】:

  • 这必须匹配 XPath/XQuery“匹配”语义,这似乎不允许控制全局标志。
  • 请使用(.*?)-(.*) 替换$1/$2 - regex101.com/r/Ge2AhY/1 xQuery 应该支持replace function
  • ^^^^这个!^^^^ 改变你的答案,我会投票一整天!
  • @robross0606 编辑后的答案已经在底部包含了这一段。
猜你喜欢
  • 1970-01-01
  • 2019-12-21
  • 2019-12-13
  • 2019-10-15
  • 1970-01-01
  • 1970-01-01
  • 2018-05-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多