模板文字中的正则表达式。转义字符

Posted

技术标签:

【中文标题】模板文字中的正则表达式。转义字符【英文标题】:Regular expression in template literals. Escaping characters 【发布时间】:2021-02-23 14:34:38 【问题描述】:

我正在尝试将 graphql-constraint-directive 与 apollo graphql 服务器一起使用。 我需要把注册。像这样的模板文字中的表达式

const typeDefs =   gql`
input ClaimInput 
  id: String!
  date: String!
  phone: String @constraint(pattern: "^05\d([-]0,1)\d7$")
  email: String
  invoice: String
  doctorId: String
  therapy: [TherapyInput]
  files: [FileInput]

`

它对我不起作用。没有匹配。正则表达式是正确的。该示例适用于这个 @constraint(pattern: "^[0-9a-zA-Z]$")*.

所以我意识到我的模板字面量 typeDefs 中的 ^05\d([-]0,1)\d7$ 有问题。

我已签入 Node REPL:

> v = `^05\d([-]0,1)\d7$`
'^05d([-]0,1)d7$'
> v = `^05\\d([-]0,1)\d7$`
'^05\\d([-]0,1)d7$'

当我把 \d \ 忽略。 当我把 \\d 我有 \\d.不是我需要的。

如何处理这种情况?

编辑: 我认为问题出在 'apollo-server' 的 gql

当我改为:

const typeDefs = gql`

input ClaimInput 
  id: String!
  date: String!
  phone: String @constraint(pattern: "^05\\d([-]0,1)\\d7$")
  email: String
  invoice: String
  doctorId: String
  therapy: [TherapyInput]
  files: [FileInput]

`

我有一个错误: GraphQLError:语法错误:无效的字符转义序列:\d。

当我变成

const typeDefsRaw = String.raw`
input ClaimInput 
  id: String!
  date: String!
  phone: String @constraint(pattern: "^05\d([-]0,1)\d7$")
  email: String
  invoice: String
  doctorId: String
  therapy: [TherapyInput]
  files: [FileInput]

`
const typeDefs = gql`$typeDefsRaw`;

我遇到了同样的错误: GraphQLError:语法错误:无效的字符转义序列:\d。

【问题讨论】:

无论如何,我已经在 apollo-serve repo 中提交了一个新问题。 github.com/apollographql/apollo-server/issues/4727。如果有任何更新,我会让大家知道 为什么不使用 graphql-constraint-directive ?它是如何与阿波罗服务器相关的?为什么 apollo-server 必须修复一些扩展问题? @xadm GraphQLError:语法错误:无效的字符转义序列:\d。 gql中的问题 那么应该是github.com/apollographql/graphql-tag ? '// 名称必须匹配 /^[_a-zA-Z][_a-zA-Z0-9]*$/ 根据 graphql-js' >> github.com/confuser/graphql-constraint-directive/blob/master/… ... 然后不支持任何转义...您必须在解析器级别对其进行限制 【参考方案1】:

你可以使用String.raw:

v = String.raw`^05\d([-]0,1)\d7$`

\\d 如果您不/不能使用String.raw 也是正确的。它只显示为\\d,因为 REPL 中的预览必须是可复制粘贴的字符串。如果你console.log(v),你只会看到一个反斜杠。

【讨论】:

感谢您的快速答复。我现在去检查一下。 你答对了。谢谢你。但是它并没有解决我的问题。【参考方案2】:

\d 表示数字,因此解决方法是使用[0-9] 而不是\d

【讨论】:

以上是关于模板文字中的正则表达式。转义字符的主要内容,如果未能解决你的问题,请参考以下文章

如何匹配正则表达式中的插入符号 (^)?

应该在正则表达式中转义哪些文字字符?

正则表达式

Java 正则表达式 转义字符

正则表达式——字符组中的转义

正则表达式匹配 html 中的转义字符