我要在以下条件下验证电话号码:
如果它不满足这些要求,我们应该将该号码弄错。
我尝试了以下方法:
print "Enter phone number: \n";
$name=<>;
chomp $name;
if (length($name)==10 && $name==~ m{/[^7-9]/}){
print "$name is valid \n";
}
else {
print "$name is not valid \n";
}
答案 0 :(得分:3)
可能值得解释一下原始版本出了什么问题。你有两张支票。第一个(length($name)==10
)很好。问题出在第二个。
$name==~ m{/[^7-9]/}
这里有三个问题。首先,您使用了错误的运算符。您知道需要将变量($name
绑定到匹配运算符,但是绑定运算符是=~
而不是==~
。但是,不幸的是,您的运算符没有足够大的错误来引发语法错误。 Perl会将其解释为数值比较(==
),然后是按位取反(~
)。那当然不是你想要的!
您的第二个问题是匹配运算符。看起来您知道match运算符是m/.../
,并且您还知道可以为match运算符选择其他定界符-您选择了m{...}
。但是您不应该嵌套这些定界符。当您使用m{/.../}
时,您正在字符串中寻找两个文字字符/
。
最后,您的实际正则表达式有问题。您希望字符串以7、8或9开头。将这些数字放在字符类([7-9]
)中是个好主意。但是,您也不应该将字符串锚点(^
)的开头放在字符类中。在字符类的开头,^
具有不同的含义-表示“不是此处列出的字符之一”。因此,您的角色类别最终含义与您想要的含义完全相反。
您的匹配表达式应如下所示:
$name =~ m{^[7-9]}
输入完整的代码:
print "Enter phone number: \n";
$name = <>;
chomp $name;
if (length($name) == 10 and $name =~ m{^[7-9]}) {
print "$name is valid \n";
}
else {
print "$name is not valid \n";
}
(我做了一些整理工作-在运算符周围添加一些空格,并按&&
的优先级将and
切换为$name
。您也可以考虑修改变量名。import React, { PropTypes, Component } from 'react';
import { BottomNavigation, Text } from 'react-native-paper';
import Previousmatches from './Tabbarfiles/Previousmatches';
import Upcomingmatches from './Tabbarfiles/Upcomingmatches';
import Yourscore from './Tabbarfiles/Yourscore';
import { StyleSheet, Platform, StatusBar, View,Dimensions } from 'react-native';
import { Container, Header, Left, Body, Right, Button, Icon,
Tab, Tabs, ScrollableTab , Title , Footer, TabHeading, FooterTab, Content} from 'native-base';
import { TabViewAnimated, TabViewPage, TabView} from 'react-native-tab-view';
export default class Home extends Component {
state = {
index: 0,
routes: [
{ key: 'music', title: 'Home', icon: 'queue-music' },
{ key: 'albums', title: 'Points Table', icon: 'album' },
{ key: 'recents', title: 'Create Scorecard', icon: 'history' },
],
};
_handleIndexChange = index => this.setState({ index });
_renderScene = BottomNavigation.SceneMap({
music: Previousmatches,
albums: Upcomingmatches,
recents: Yourscore,
});
render() {
return (
<Container style={styles.container}>
<Header hasTabs style={styles.header}>
<Left>
<Button transparent onPress={() => this.props.navigation.navigate("DrawerOpen")}>
<Icon name='menu' />
</Button>
</Left>
<Body>
<Title>PALMS</Title>
</Body>
<Right />
</Header>
<Tabs locked tabContainerStyle={{height: 45}}>
<Tab heading={ <TabHeading><Text style={styles.tabTextStyle}>PREVIOUS MATCHES</Text></TabHeading>}>
<Previousmatches />
</Tab>
<Tab heading={ <TabHeading><Text style={styles.tabTextStyle}>UPCOMING MATCHES</Text></TabHeading>}>
<Upcomingmatches />
</Tab>
<Tab heading={ <TabHeading><Text style={styles.tabTextStyle}>YOUR SCORE</Text></TabHeading>}>
<Yourscore />
</Tab>
</Tabs>
<BottomNavigation style={{height: '100%'}} navigationState={this.state} onIndexChange={this._handleIndexChange}
renderScene={this._renderScene} />
</Container>
);
}
};
const styles = StyleSheet.create({
textStyle : {
fontSize: 9
},
container: {
flex: 1,
height: '100%',
...Platform.select({
android: {
// marginTop: StatusBar.currentHeight,
}
})
},
header:{
...Platform.select({
android: {
height: 40
}
}),
backgroundColor: 'rgba(81, 133, 237, 1.0)'
},
tabBarStyle : {
height: 50
},
tabTextStyle : {
fontSize: 10,
alignContent: 'center',
color:'white'
// justifyContent: 'center'
},
})
不是包含电话号码的变量的好名字!)
答案 1 :(得分:1)
我只在这里使用一个正则表达式:
^[789][0-9]{9}$
这避免了将验证逻辑分散到几个地方。
if ($name =~ m{/^[789][0-9]{9}$/}){
print "$name is valid \n";
}
else {
print "$name is not valid \n";
}