Ruby的Regexp.names是否有Perl等价物?

时间:2018-03-28 11:50:29

标签: regex perl capturing-group

在Ruby中,您可以使用class HomeScreen extends Component { static navigationOptions = { title: "" }; constructor(props) { super(props); this.state = {}; this.onStudentChange = this.onStudentChange.bind(this); this.onGroupChange = this.onGroupChange.bind(this); this.onParentChange = this.onParentChange.bind(this); this.onSubmit = this.onSubmit.bind(this); } componentDidMount() {} onParentChange(e) { const { setYear: year } = this.props.credentials; this.props.dispatch(setYear(e)); } onGroupChange(e) { console.log(this.props); const { setYear } = this.props.credentials; const { categories } = this.props.categories; if (e !== null) { this.props.dispatch(setGroup(e, categories, setYear)); } } onStudentChange(e) { if (e !== "") { this.props.dispatch(setStudent(e)); } } onSubmit(e) { this.props.navigation.navigate("Month"); } render() { const { setYear, setGroup, setStudent, showStudent } = this.props.credentials; const categories = this.props.categories; const isLoading = this.props.isLoading; if (isLoading || !categories) { return ( <View style={[styles.container, styles.horizontal]}> <ActivityIndicator size="large" color="#fff" /> </View> ); } return ( <View style={styles.container}> <Image source={require("../img/logoGreen.png")} style={{ width: 300, height: 200 }} /> <View style={{ backgroundColor: "white" }}> <Picker selectedValue={setYear} label="Year" onChange={this.onParentChange} options={categories} /> {setYear ? ( <Picker selectedValue={setGroup} label="Group" // invoked when picker above is changed. onChange={this.onGroupChange} options={ categories.find(category => { return category.id == setYear; }).options } /> ) : null} {setGroup && showStudent ? ( <Picker selectedValue={setStudent} label="Student" onChange={this.onStudentChange} options={ categories .find(category => { return category.id == setYear; }) .options.find(category => { return category.id == setGroup; }).options } /> ) : null} {(setYear && setGroup && !showStudent) || setStudent ? ( <TouchableHighlight style={styles.button} onPress={this.onSubmit} > <Text style={styles.buttonText}> Submit</Text> </TouchableHighlight> ) : null} </View> </View> ); } 方法提取正则表达式的命名捕获组:

names

这种方法是否有Perl等价物?我可以提取这样的名字:

/(?<foo>.)(?<bar>.)(?<baz>.)/.names
#=> ["foo", "bar", "baz"]

但我不知道解决方案是多么强大/高效/优雅。

已编辑:我知道您可以在匹配后获取名称,但我需要在使用正则表达式之前提取名称。

2 个答案:

答案 0 :(得分:4)

您可以在成功匹配后提取组的名称:

my $re = qr/(?<foo>.)(?<bar>.)(?<baz>.)/;
'abc' =~ $re;
say for keys %-;

另见Tie::Hash::NamedCapture

答案 1 :(得分:2)

请参阅PPIx::Regexp::capture_names

foreach my $name ( $re->capture_names() ) {
      print "Capture name '$name'\n";
 }
     

此便捷方法返回正则表达式中的捕获名称。

我没有尝试过这个模块,所以我不确定提取你想要的信息是否100%可靠。

另请参阅@ ikegami对this question的回答,这导致我重新阅读perldoc re

  

regnames($all)

     

返回上一个中定义的所有命名缓冲区的列表           成功的比赛。如果$all为真,则返回定义的所有名称,           如果不是,它只返回参与比赛的名称。

如此接近,但并不完全。我不知道在Ruby的.names方式中对Perl中的正则表达式模式进行内省的内置方法。