正则表达式以匹配有效的JavaScript名称空间

时间:2018-08-02 23:27:16

标签: javascript regex

匹配正确的任意深度JavaScript名称空间的正则表达式是什么?

有效条目

  • activatedRoute
  • a
  • a.b
  • $a._b.$$c.__d

因此,基本上,JavaScript开放名称变量由点连接,并且每个单独的名称可以包含a_$09.b_$09.c_$09a-zA-Z_$ ,但不能以0-9开头。

无效条目

  • 0-9-不能以数字开头
  • 1a-子名称也不能以数字开头
  • abc.1a-不能有前导点
  • .a-不能以点结尾

我尝试过以下一种方法:a.,虽然禁止结尾的^([a-z$_][a-z$_0-9]*\.?)*[^\.]$,但最后允许任何多余的符号,例如.,这是无效的。

1 个答案:

答案 0 :(得分:1)

使用public class ProfileMobileRoot : Profile { public ProfileMobileRoot() { CreateMap<MobileInfo, MobileWidget>() .ForMember(x=>x.Name, opt=>opt.MapFrom(x=>x.WidgetName)); CreateMap<IEnumerable<MobileInfo>, IEnumerable<MobileDashboard>>() .ConvertUsing<DashboardConverter>(); CreateMap<IEnumerable<MobileInfo>, IEnumerable<MobileSolution>>() .ConvertUsing<SolutionConverter>(); CreateMap<IEnumerable<MobileInfo>, IEnumerable<MobileUser>>() .ConvertUsing<UserConverter>(); CreateMap<IEnumerable<MobileInfo>, MobileRoot>() .ForMember(x => x.Users, opt => opt.MapFrom(x => x.ToList())); } } class UserConverter : ITypeConverter<IEnumerable<MobileInfo>, IEnumerable<MobileUser>> { public IEnumerable<MobileUser> Convert(IEnumerable<MobileInfo> source, IEnumerable<MobileUser> destination, ResolutionContext context) { var groups = source.GroupBy(x => new { x.NameFull, x.EmailAddress}); foreach (var v in groups) { yield return new MobileUser() { EmailAddress = v.Key.EmailAddress, NameFull = v.Key.NameFull, Solutions = context.Mapper.Map<IEnumerable<MobileSolution>>(source.Where(x => v.Key.NameFull == x.NameFull && v.Key.EmailAddress== x.EmailAddress)).ToList() }; } } } class SolutionConverter : ITypeConverter<IEnumerable<MobileInfo>, IEnumerable<MobileSolution>> { public IEnumerable<MobileSolution> Convert(IEnumerable<MobileInfo> source, IEnumerable<MobileSolution> destination, ResolutionContext context) { var groups = source.GroupBy(x => new { x.SolutionName, x.SortOrder}); foreach (var v in groups) { yield return new MobileSolution() { Solution = v.Key.SolutionName, SortOrder = v.Key.SortOrder, Dashboards= context.Mapper.Map<IEnumerable<MobileDashboard>>(source.Where(x => v.Key.SolutionName== x.SolutionName&& v.Key.SortOrder== x.SortOrder)).ToList() }; } } } class DashboardConverter : ITypeConverter<IEnumerable<MobileInfo>, IEnumerable<MobileDashboard>> { public IEnumerable<MobileDashboard> Convert(IEnumerable<MobileInfo> source, IEnumerable<MobileDashboard> destination, ResolutionContext context) { var groups = source.GroupBy(x => new {x.Name, x.IsLegacy, x.Description}); foreach (var v in groups) { yield return new MobileDashboard() { Dashboard = v.Key.Name, Description = v.Key.Description, IsLegacy = v.Key.IsLegacy, Widgets = context.Mapper.Map<IEnumerable<MobileWidget>>(source.Where(x => v.Key.IsLegacy == x.IsLegacy && v.Key.Name == x.Name && v.Key.Description == x.Description)) }; } } }

因为 \ w 匹配任何单词字符(等于 [a-zA-Z0-9 _] ),

如@ emsimpson92所说,您可以使用一个简化版本:

^[a-zA-Z\$\_][0-9a-zA-Z\$\_]*(\.[a-zA-Z\$\_][0-9a-zA-Z\$\_]*)*$

对于@ vitaly-t所评论的最短版本(已删除不必要的转义),它将为:

^[a-zA-Z\$\_][\$\w]*(\.[a-zA-Z\$\_][\$\w]*)*$

Regex Online